PL/SQL Webサービスと型

PL/SQL Webサービスには制限事項が多数あり、特定の状況の場合には作成できません。これらについては、以降の各項で説明します。

オーバーロードされたプログラム・ユニット

同じパッケージ内の他のプログラム・ユニットと名前を共有するプログラム・ユニットが、オーバーロードされたプログラム・ユニットです。同じ名前のプログラム・ユニットが複数ある場合、WSDLプロセッサでは実行時に、実行するプログラム・ユニットを判別できません。このため、それらのPL/SQLプログラム・ユニットはWebサービスとしてデプロイできません。オーバーロードされたプログラム・ユニットの問題を回避する例を次に示します。要件に応じて調整できます。

次のプログラムを含むPL/SQLパッケージについて考えてみます。

-- promotes an employee to the specified rank
PROCEDURE promote_emp(empno IN NUMBER, rank IN NUMBER);

-- promotes an employee to the rank above their current rank
PROCEDURE promote_emp(empno IN NUMBER);

次のいずれかの方法で、型のオーバーロードに対処できます。

2つのプロシージャを次に示します。

-- promotes an employee to the specified rank
PROCEDURE promote_emp_to_rank(empno IN NUMBER, rank IN NUMBER) IS
BEGIN
promote_emp(empno, rank);
END;

-- promotes an employee to the rank above their current rank
PROCEDURE promote_emp_to_next_rank(empno IN NUMBER) IS
BEGIN
promote_emp(empno);
END;

BFILE型

PL/SQLのBFILE型は、OUT引数またはファンクション戻り値としてのみ使用されます。

BCLOB型

PL/SQL型のBCLOBはサポートされていません。

OUTおよびIN-OUTパラメータ

OUTまたはIN-OUTパラメータのあるプログラム・ユニットを公開すると、OUTまたはIN-OUTパラメータのそれぞれに属性が1つある戻り型の構造でコール元に戻されます。たとえば、シグネチャ

PROCEDURE a_proc(val1 IN VARCHAR2, val2 IN OUT NUMBER, val3 OUT INTEGER)のあるサービスでは次のようになります。

このサービスでは、生成された結果のクラスにval2 およびval3 という最終値を返します。生成されたクラスでは、アクセッサ・メソッドを使用してこれらの値にアクセスできます。

PL/SQLレコードからのPL/SQL Webサービスの作成

JDeveloperでは、PL/SQLレコードを使用するPL/SQLパッケージからWebサービスを直接作成することはできません。旧バージョンのOracleデータベースから移行したPL/SQLパッケージを使用している場合、パッケージでやりとりされるパラメータがオブジェクト型ではなくレコード型であるために、機能をWebサービスとして公開しようとしても実行できない場合があります。

レコード型を含むパッケージではJPublisherを使用できます。生成されるSQLファイルをデータベースに対して実行すると、オブジェクト型を含む同じ内容のパッケージが作成されます。この新しいパッケージを使用すると、通常どおりにPL/SQL Webサービスを作成できます。

JPublisherのウィザードの詳細は、「JPublisherについて」を参照してください。

複数のスキーマからアクセスできる同じ名前のストアド・プロシージャ

Oracle9i Databaseリリース2(9.2)では、同じ名前とパッケージ名を持つストアド・プロシージャまたはストアド・ファンクションに複数のスキーマからアクセスできる場合、PL/SQL Webサービスの公開中に起動されたSQLJトランスレータは異常終了します。

この問題を解決するには、公開するパッケージが1つのスキーマのみで認識されるようにし、他のスキーマのパッケージで同じ名前を使用しないようにしてください。

戻り型Refカーソル

次の例のように、戻り型にrefカーソルを使用しているパッケージから、Webサービスを作成することはできません。

PACKAGE TEST AS
type EmpCurType is ref cursor;
function EmpData return TEST.EmpCurType;
END;

SYSスキーマ

任意のユーザーがSYS権限を引き継ぐことを防ぐため、中間層からはSYS権限のある接続を特定できません。つまり、SYSスキーマ内のパッケージからはWebサービスを作成できません。

たとえば、JDeveloper内にWebサービスを作成するために、中間層からSYSスキーマ内のPL/SQLパッケージにアクセスする必要がある場合には、SYSとしてデータベースにログオンし、自分の使用するユーザーにパッケージのEXECUTE権限を付与し、JDeveloperデータベース接続を作成します。

パッケージ仕様部で宣言される型

PL/SQLパッケージは、パッケージ仕様部で型を宣言できますが、このようなパッケージはWebサービスとして公開できません。これを回避するには、パッケージのスコープ外で型を作成します。

PL/SQLネスト表

JDeveloperでは、PL/SQLネスト表を使用するPL/SQLパッケージからWebサービスを直接作成することはできません。