EXECUTE CALL

EXECUTE CALL コマンドを使って、ストアド・プロシージャを実行します。
このストアド・プロシージャにはSQLステートメントが含まれます。この CALL コマンドは、*QUERY、*UPDATE、または*EXECUTE のいずれかのタイプを指定する CALLTYPE コマンドと共に使用されます。
構文:

コマンド

キーワード

開発者用メモ

EXECUTE

CALL

必須。ストアド・プロシージャの名前。

 

CALLTYPE

*QUERY

任意。ストアド・プロシージャで使用する SQL ステートメントのタイプを指定します。
ストアド・プロシージャの SQL ステートメントがクエリーの場合、CALL によって結果セットが作業リストに返されます。
デフォルト。

 

 

*UPDATE

ストアド・プロシージャの SQL ステートメントが更新、挿入または削除の場合、CALL によって (更新されたレコード数の) 行数が #JSMMSG フィールドに返されます。

 

 

*EXECUTE

このキーワードを指定した場合、ストアド・プロシージャでは何も返されません。

 

CALLSYNTAX

*JDBC

任意。標準の JDBC 構文を使用することを示します。 デフォルト。

 

 

*ORACLE

Oracle の JDBC 構文を使用することを示します。

 

RETURN

*NONE

任意。ストアド・プロシージャ/ファンクションからの戻り値のデータ・タイプを指定します。 値は何も返されません。
デフォルト。

 

 

*CHAR

 

 

 

*STRING

 

 

 

*SMALLINT

 

 

 

*INTEGER

 

 

 

*FLOAT

 

 

 

*DOUBLE

 

 

 

*DECIMAL

 

 

 

*NUMERIC

 

 

 

*ORACLECURSOR

返される値は、Oracle クエリーの結果セットにアクセスする際に代替として使用されるカーソルになります。これは、Oracle ドライバーを使用する Oracle データベースでのみ使用できます。

パラメータは、作業リストやSET PARAMETER(*LIST)コマンドを使用してリモート・プロシージャに渡すことができます。この方法の詳細については、下記「リストと変数」を参照してください。
ストアド・プロシージャは結果セットの代替として単一の値を返すことも可能です。結果セットは、クエリーから返される1つ以上のレコードや値のリストですが、代替として返される値は、完了時にストアド・プロシージャが返す単一の値です。典型的なストアド・プロシージャ構文には、ストアド・プロシージャで実行する最後のコマンドの 1 つとして、RETURN またはこれに類するコマンド (ターゲット・データベースの構文により異なる) と関連フィールド名があります。この値は何でも構いませんが、一般的な例としては、選択または更新されたレコード数、最大値、フラグなどを含むフィールドがあります。
RETURN キーワードでは、返す値のデータ・タイプを指定できます。可能なデータ・タイプは、ターゲット・データベースとJDBCドライバーでサポート可能なコンテンツによって異なります。例えば、IBM i で現在サポートされるのは、ストアド・プロシージャから返される値のデータ・タイプ Integer のみになります。最終的には、ターゲット・データベースとJDBCドライバーで対応可能なデータ・タイプをユーザーの責任において把握してください。
ストアド・プロシージャ呼び出しによっては、実行されたことを伝える警告が返されるため、SET ONWARNING(*CONTINUE) コマンドを使用して警告チェックを無効にする必要があります。警告のエラーコード 466 (結果セットはプロシージャから利用可能) は自動的に無視され、警告として扱われません。
ストアド・プロシージャの作成例は後半に紹介されています。
Oracleに関する注意事項
Oracleデータベースは、データベース・ファンクションから値を返す際に使用される場合、JDBC構文を完全にサポートするわけではありません。Oracle構文でのみ機能します。これは、CALLSYNTAXを*ORACLEとして指定する必要があるためです。その結果、SQLServiceでは予想される事態とその対処方法を把握します。
Oracleには2種類の呼び出し可能なプログラムがあります。1つはストアド・プロシージャ、もう1つはファンクションです。ストアド・プロシージャは値を返すことができないため、値を返したい場合はファンクションを使用する必要があります。
Oracle JDBC ドライバーと Oracle データベースでは、Java JDBC の「"ResultSet resultSet = call.executeQuery ()"」メソッドをサポートしません。Oracle で結果セットを JDBC クライアントに返す場合、Oracle カーソルを返す Oracle ファンクションを作成する必要があり、JDBC の call.execute () を使用する必要があります。ターゲット・データベースが Oracle で、結果セットがストアド・プロシージャから返されると予想される場合、この EXECUTE コマンドの RETURN 値として *ORACLECURSOR を指定する必要があります。これはSQLServiceで使用され、どのレコードを返すかを決定します。カーソルが返されることを示すこの明示的な要件は、Oracleのみに関連します。他のデータベースでは、結果セットの取得に関してこのキーワードを使用する必要はありません。キーワードでこの値を使用する場合、カーソルが SQLService に返されるように Oracle ファンクションで 'RETURN cursorname' コマンドを使用する必要があります。
Oracle のストアド・プロシージャ例
以下に、結果セットを作成するOracleデータベース・ファンクションの例を示します。カーソルが返されることに注意してください。
本書では、ストアド・プロシージャの作成について詳しく説明していません。そのため、他の媒体でこのトピックについて詳しく調べることをお勧めします。
CREATE OR REPLACE FUNCTION "SYSTEM"."TEST" ( PARAM1 IN CHAR, PARAM2 IN CHAR ) RETURN SYS_REFCURSOR AS CURSOR_1 SYS_REFCURSOR ;
BEGIN
OPEN CURSOR_1 FOR SELECT * FROM MYTABLE WHERE FLD_1='AB';
RETURN CURSOR_1 ;
END;
SQLService を使用してこのファンクションを実行する場合は、次の EXECUTE コマンドのようなコマンドが使用できます。:
SET PARAMETER(*LIST) #WRKLST(PARM1,PARAM2)
EXECUTE CALL("TEST(?,?)") CALLTYPE(*EXECUTE) CALLSYNTAX(*ORACLE) RETURN(*ORACLECURSOR) #WRLST(COL1,COL2)
IBM i のストアド・プロシージャ例
IBM i データベースのストアド・プロシージャを作成するには、ソース・メンバーを編集し、メンバー・タイプ TXT を使用する必要があります。
以下に、IBM i の 3 つのストアド・プロシージャの例を示します。最初の行は、ストアド・プロシージャの名前を指定することに注意してください。例えば、最初の行はCALLSELECTと呼ばれ、その場所はJSMJDBCライブラリになります。2番目と3番目の例は、値が返される状況を示しています。
本書では、ストアド・プロシージャの作成について詳しく説明していません。そのため、このトピックについて詳しく調べることをお勧めします。IBM InfocentreおよびRedbooksにはこのトピックに関する情報が豊富にあるため、これらの参照から始めると良いかもしれません。どちらもIBM Webサイトで入手できます。