ネイティブ SQL プロシージャーと外部プロシージャーの相違点

SQL プロシージャーは、全体が SQL ステートメントで記述されます。 外部プロシージャーは、ホスト言語で記述され、SQL ステートメントを含むことができます。 SQL CALL ステートメントを使用して両方のタイプのプロシージャーを呼び出すことができます。 ただし、動作と準備についてのいくつかの重要な相違点を考慮する必要があります。

ネイティブ SQL プロシージャーと外部プロシージャーの相違点は次の通りです。
エラーの処理方法
  • SQL プロシージャーの場合、プロシージャーにRETURN ステートメントまたはハンドラーが含まれない場合、 Db2 は SQLCA に自動的にSQL条件を戻します。 SQLプロシージャにおけるエラー処理のさまざまな方法については、「SQLプロシージャにおけるSQL条件の処理」 を参照してください。
  • 外部ストアード・プロシージャーの場合、Db2はSQLCAのSQL 条件を呼び出し側アプリケーションに戻しません。 外部プロシージャーを定義するときにPARAMETERSTYLE SQLを使う場合、プロシージャーが終了する前にエラーを示すようにSQLSTATEを設定できます。 有効なSQLSTATE値については、 SQLSTATE値と一般的なエラーコードを参照してください。
ストアード・プロシージャーのコードの指定方法
SQL プロシージャー定義には、ストアード・プロシージャーのソース・コードが含まれます。 外部ストアード・プロシージャーの定義では、 そのストアード・プロシージャー・プログラムの名前を指定します。
ストアード・プロシージャーを定義する方法。
ネイティブ SQLプロシージャーと外部プロシージャーの両方について、CREATE PROCEDURE ステートメントを実行することによって、ストアード・プロシージャーをDb2 に定義します。 外部プロシージャーの場合は、プロシージャーのソース・コードを個別にパッケージにバインドしなければなりません。 これは、CREATE PROCEDUREステートメントを発行して外部プロシージャーを定義する前または後に行うことができます。

ネイティブ SQL プロシージャーの作成
下例は、 SQLプロシージャーの定義を示しています。
CREATE PROCEDURE UPDATESALARY1         1 
 (IN EMPNUMBR CHAR(10),                2 
 IN RATE DECIMAL(6,2))
 LANGUAGE SQL                          3 
  UPDATE EMP                           4 
   SET SALARY = SALARY * RATE
   WHERE EMPNO = EMPNUMBR
注:
1
ストアード・プロシージャー名は UPDATESALARY1。
2
この 2 つのパラメーターのデータ・タイプは CHAR(10) と DECIMAL(6,2)。 両方とも 入力パラメーターです。
3
LANGUAGE SQL は、これが SQL プロシージャーであること、したがってプロシージャーの本体が 他のパラメーターの後ろに続いていることを指示している。
4
このプロシージャーの本体は、従業員表内の行を更新する単一の SQL UPDATE ステートメントから 構成される。
外部ストアード・プロシージャーの作成
次の例は、COBOLで記述された同等の外部ストアドプロシージャの定義を示しています。 この従業員の給与を更新するストアード・プロシージャー・プログラム は UPDSAL と呼ばれます。
CREATE PROCEDURE UPDATESALARY1         1 
 (IN EMPNUMBR CHAR(10),                2 
 IN RATE DECIMAL(6,2))
 LANGUAGE COBOL                        3 
 EXTERNAL NAME UPDSAL;                 4 
注:
1
ストアード・プロシージャー名は UPDATESALARY1。
2
この 2 つのパラメーターのデータ・タイプは CHAR(10) と DECIMAL(6,2)。 両方とも 入力パラメーターです。
3
LANGUAGE COBOL は、これが外部プロシージャーであること、したがってこのストアード・プロシージャーのコードは別個の COBOL プログラム内にあることを指示している。
4
実行可能ストアード・プロシージャー・プログラムを含んでいるロード・モジュールの名前は UPDSAL。