SQL 解説書

CREATE PROCEDURE

このステートメントは、 ストアード・プロシージャーをアプリケーション・サーバーに登録する場合に使用されます。

呼び出し

このステートメントは、アプリケーション・プログラムに組み込むか、 または動的 SQL ステートメントを使用して発行することができます。 このステートメントは、動的に準備可能な実行可能ステートメントです。 しかし、バインド・オプション DYNAMICRULES BIND を適用する場合、 ステートメントを動的に準備することはできません (SQLSTATE 42509)。

許可

このステートメントの許可 ID には、以下の特権が少なくとも 1 つ含まれている必要があります。

非分離のストアード・プロシージャーを作成するには、 ステートメントの許可 ID の特権に以下の特権の少なくとも 1 つが含まれている必要があります。

分離ストアード・プロシージャーを作成する場合、追加の権限や特権は必要ありません。

許可 ID の権限が不十分で、操作を実行できない場合には、エラー (SQLSTATE 42502) になります。

構文

>>-CREATE PROCEDURE--------------------------------------------->
 
>----procedure-name--(--+----------------------------------------------+---)->
                        |  .-,---------------------------------------. |
                        |  V .-IN----.                               | |
                        '----+-------+---parameter-name--data-type---+-'
                             +-OUT---+
                             '-INOUT-'
 
>----*----+--------------------------+--*----------------------->
          '-SPECIFIC--specific-name--'
 
      .- DYNAMIC RESULT SETS 0--------.  (1)
>-----+-------------------------------+---------*--------------->
      '-DYNAMIC RESULT SETS--integer--'
 
      .-MODIFIES SQL DATA--.       .-NOT DETERMINISTIC--.
>-----+--------------------+--*----+--------------------+--*---->
      |        (2)         |       '-DETERMINISTIC------'
      +-NO SQL-------------+
      +-CONTAINS SQL-------+
      '-READS SQL DATA-----'
 
                            (3)
     .-CALLED ON NULL INPUT------.
>----+---------------------------+---*-------------------------->
 
>-----+-LANGUAGE--+-C-----+--*----| external-procedure-options |--*--+>
      |           +-JAVA--+                                          |
      |           +-COBOL-+                                          |
      |           '-OLE---'                                          |
      '-LANGUAGE--SQL---*----| SQL-procedure-body |------------------'
 
>--------------------------------------------------------------><
 
external-procedure-options
 
                                                 .-FENCED-----.
|---*---EXTERNAL--+----------------------+--*----+------------+->
                  '-NAME--+-'string'---+-'       '-NOT FENCED-'
                          '-identifier-'
 
>----*---PARAMETER STYLE--+-DB2DARI------------+--*------------->
                          |            (4)     |
                          +-DB2GENERAL---------+
                          +-GENERAL------------+
                          +-GENERAL WITH NULLS-+
                          +-DB2SQL-------------+
                          '-JAVA---------------'
 
                                       .-NO DBINFO--.
>-----+------------------------+--*----+------------+--*--------|
      '-PROGRAM TYPE--+-SUB--+-'       '-DBINFO-----'
                      '-MAIN-'
 
SQL-procedure-body
 
|---SQL-procedure-statement-------------------------------------|
 

注:

  1. DYNAMIC RESULT SETS の代わりに RESULT SETS を指定できます。

  2. LANGUAGE SQL の場合、NO SQL を選択できません。

  3. CALLED ON NULL INPUT の代わりに NULL CALL を指定できます。

  4. DB2GENERAL の代わりに DB2GENRL を、GENERAL の代わりに SIMPLE CALL を、 GENERAL WITH NULLS の代わりに SIMPLE CALL WITH NULLS を指定できます。

説明

procedure-name
定義するプロシージャーの名前を指定します。 この名前は、プロシージャーを指定する修飾または非修飾の名前です。 procedure-name (プロシージャー名) の非修飾形式は SQL 識別子です (最大長 128)。 動的 SQL ステートメントでは、CURRENT SCHEMA 特殊レジスターは、 修飾子のないオブジェクト名の修飾子として使用されます。 静的 SQL ステートメントでは、 QUALIFIER プリコンパイル / バインド・オプションにより、 修飾子のないオブジェクト名の修飾子が暗黙指定されます。 修飾形式は、schema-name の後にピリオドと SQL 識別子が続きます。

暗黙または明示の修飾子を含む名前と、パラメーターの数との組み合わせは、 カタログにすでに記述されているプロシージャーを指定するものであってはなりません (SQLSTATE 42723)。 非修飾名とパラメーターの数との組み合わせは、そのスキーマ内では当然固有ですが、 複数のスキーマ間で固有である必要はありません。

2 つの部分から成る名前を指定する場合、 "SYS" で始まる schema-name (スキーマ名) は使用できません。 使用した場合、エラー (SQLSTATE 42939) になります。

( IN | OUT | INOUT parameter-name data-type,...)
プロシージャーのパラメーターを指定し、 各パラメーターのモード、名前、およびデータ・タイプを指定します。 このリストには、 プロシージャーが予期する各パラメーターごとに 1 つの項目を指定する必要があります。

パラメーターのないプロシージャーも登録可能です。 この場合、指定するデータ・タイプがない場合でも、括弧はコーディングする必要があります。 たとえば、

    CREATE PROCEDURE SUBWOOFER() ...

1 つのスキーマに同じ名前の 2 つのプロシージャーがある場合、 パラメーターの数をまったく同一にすることはできません。 このタイプの比較では長さ、精度、および位取りは考慮されません。 したがって、CHAR(8) と CHAR(35)、また DECIMAL(11,2) と DECIMAL (4,3) は、 それぞれ同じタイプとみなされます。 さらに、DECIMAL と NUMERIC などのように、 この目的で複数のタイプが同じタイプとして扱われることがあります。 シグニチャーが重複していると、SQL エラー (SQLSTATE 42723) になります。

たとえば、次のステートメントの場合、

  CREATE PROCEDURE PART (IN NUMBER INT, OUT PART_NAME CHAR(35)) ...
  CREATE PROCEDURE PART (IN COST DECIMAL(5,3), OUT COUNT INT) ...

2 番目のステートメントは失敗します。 その理由は、データ・タイプが異なっていてもプロシージャーのパラメーターの数が同じであるからです。

IN | OUT | INOUT
パラメーターのモードを指定します。
  • IN - パラメーターは入力のみ
  • OUT - パラメーターは出力のみ
  • INOUT - パラメーターは入力と出力の両方

parameter-name
パラメーターの名前を指定します。

data-type
パラメーターのデータ・タイプを指定します。
  • CREATE TABLE ステートメントのデータ・タイプ の定義に指定することが可能で、 プロシージャーの作成に使用されている言語に対応するものがある SQL データ・タイプ指定と省略形を指定できます。 ストアード・プロシージャーに関する SQL データ・タイプとホスト言語データ・タイプの対応については、 アプリケーション開発の手引き の言語別の項を参照してください。
  • ユーザー定義データ・タイプはサポートされていません (SQLSTATE 42601)。

SPECIFIC specific-name
定義するプロシージャーのインスタンスに対する固有名を指定します。 この特定名は、このプロシージャーを除去する場合、 またはこのプロシージャーにコメントを付ける場合に使用することができます。 これは、プロシージャーの呼び出しには使用できません。 specific-name (特定名) の非修飾形式は SQL 識別子です (最大長 18)。 修飾形式は、schema-name の後にピリオドと SQL 識別子が続きます。 暗黙または明示の修飾子も含めて、その名前が、 アプリケーション・サーバーに存在する他のプロシージャー・インスタンスを指定するものであってはなりません。 そうでない場合、エラー (SQLSTATE 42710) になります。

specific-name は、既存の procedure-name と同じであっても構いません。

修飾子の指定がない場合、procedure-name に使用された修飾子が使用されます。 修飾子を指定する場合は、 procedure-name の明示または暗黙の修飾子と同じにする必要があります。 そうでない場合、エラー (SQLSTATE 42882) になります。

specific-name の指定がない場合、 固有の名前がデータベース・マネージャーによって生成されます。 生成される固有の名前は、 SQL の後に文字のタイム・スタンプが続く名前です (SQLyymmddhhmmsshhn)。

DYNAMIC RESULT SETS integer
ストアード・プロシージャーから戻される結果セットの上限の見積もりを指定します。 詳細は、SQL 解説書の中の 『ストアード・プロシージャーから戻される結果セット』の項を参照してください。

上位互換またはファミリーの互換性のために、 値 RESULT SETS を DYNAMIC RESULT SETS の同義語として使うことができます。

NO SQL, CONTAINS SQL, READS SQL DATA, MODIFIES SQL DATA
ストアード・プロシージャーから SQL ステートメントが発行されるかどうかと、 もし発行されればどのタイプかを示します。

NO SQL
ストアード・プロシージャーはどの SQL ステートメントも実行できないことを指示します (SQLSTATE 38001)。

CONTAINS SQL
SQL データの読み取りも変更も行わない SQL ステートメントを、 ストアード・プロシージャーで実行できることを指定します (SQLSTATE 38004 または 42985)。 どのストアード・プロシージャーでもサポートされていないステートメントは、 これとは異なるエラーを戻します (SQLSTATE 38003 または 42985)。

READS SQL DATA
SQL データを変更しない SQL ステートメントを、 ストアード・プロシージャーで実行できることを指定します (SQLSTATE 38002 または 42985)。 どのストアード・プロシージャーでもサポートされていないステートメントは、 これとは異なるエラーを戻します (SQLSTATE 38003 または 42985)。

MODIFIES SQL DATA
このストアード・プロシージャーは、 ストアード・プロシージャーでサポートされていないステートメント以外の すべての SQL ステートメントを実行できることを指定します (SQLSTATE 38003 または 42985)。

この後の表は、SQL ステートメント (第 1 列に指定されているもの) を、 指定された SQL データ・アクセス指示を使ってストアード・プロシージャーで実行できるかどうかを示します。 NO SQL と定義されたストアード・プロシージャー内に実行可能な SQL ステートメントが出現すると、 SQLSTATE 38001 が戻されます。 その他の実行コンテキストの場合、 どのコンテキストでもサポートされていない SQL ステートメントは SQLSTATE 38003 を戻します。 CONTAINS SQL コンテキスト内で使えないその他の SQL ステートメントの場合は SQLSTATE 38004 が戻され、 READS SQL DATA コンテキストの場合は SQLSTATE 38002 が戻されます。 SQL プロシージャーの作成時に SQL データ・アクセス指示に一致しないステートメントがあると、 SQLSTATE 42895 が戻されることになります。


表 21. SQL ステートメントと SQL データ・アクセス指示
SQL ステートメント NO SQL CONTAINS SQL READS SQL DATA MODIFIES SQL DATA
ALTER... N N N Y
BEGIN DECLARE SECTION Y(1) Y Y Y
CALL N Y(4) Y(4) Y(4)
CLOSE CURSOR N N Y Y
COMMENT ON N N N Y
COMMIT N N N N
COMPOUND SQL N Y Y Y
CONNECT(2) N N N N
CREATE N N N Y
DECLARE CURSOR Y(1) Y Y Y
DECLARE GLOBAL TEMPORARY TABLE N Y Y Y
DELETE N N N Y
DESCRIBE N N Y Y
DISCONNECT(2) N N N N
DROP ... N N N Y
END DECLARE SECTION Y(1) Y Y Y
EXECUTE N Y(3) Y(3) Y
EXECUTE IMMEDIATE N Y(3) Y(3) Y
EXPLAIN N N N Y
FETCH N N Y Y
FREE LOCATOR N Y Y Y
FLUSH EVENT MONITOR N N N Y
GRANT ... N N N Y
INCLUDE Y(1) Y Y Y
INSERT N N N Y
LOCK TABLE N Y Y Y
OPEN CURSOR N N Y Y
PREPARE N Y Y Y
REFRESH TABLE N N N Y
RELEASE CONNECTION(2) N N N N
RELEASE SAVEPOINT N N N Y
RENAME TABLE N N N Y
REVOKE ... N N N Y
ROLLBACK N Y Y Y
ROLLBACK TO SAVEPOINT N N N Y
SAVEPOINT N N N Y
SELECT INTO N N Y Y
SET CONNECTION(2) N N N N
SET INTEGRITY N N N Y
SET 特殊レジスター N Y Y Y
UPDATE N N N Y
VALUES INTO N N Y Y
WHENEVER Y(1) Y Y Y

注:

  1. NO SQL オプションは SQL ステートメントを指定できないことを暗黙指定しますが、 実行不能ステートメントに対する制限はありません。

  2. どのストアード・プロシージャー実行コンテキストでも、 接続管理ステートメントは使えません。

  3. これは、実行しようとするステートメントによって異なります。 EXECUTE ステートメントで指定するステートメントは、 有効な個々の SQL アクセス・レベルのコンテキストで使えるものでなければなりません。 たとえば、有効な SQL アクセス・レベルが READS SQL DATA である場合、 ステートメントは INSERT、UPDATE、または DELETE であってはなりません。

  4. ストアード・プロシージャー内の CALL ステートメントでは、 呼び出し側のストアード・プロシージャーと同じプログラム言語で 作成されているストアード・プロシージャーしか参照することができません。

LANGUAGE
この文節は必須で、 ストアード・プロシージャーの本体が準拠している言語インターフェース規則を指定するのに使用されます。

C
データベース・マネージャーは、 ストアード・プロシージャーを C プロシージャーであるかのように呼び出します。 ストアード・プロシージャーは、 標準 ANSI C プロトタイプで定義されている C 言語の呼び出し規則およびリンケージ規則に 準拠していなければなりません。

JAVA
データベース・マネージャーは、 Java クラス内のメソッドとしてストアード・プロシージャーを呼び出します。

COBOL
データベース・マネージャーは、 プロシージャーを COBOL プロシージャーであるかのように呼び出します。

OLE
データベース・マネージャーは、 OLE 自動化オブジェクトによって公開されたメソッドであるものとしてストアード・プロシージャー呼び出します。 ストアード・プロシージャーは、OLE 自動化データ・タイプと呼び出しメカニズムに準拠している必要があります。 さらに OLE 自動化オブジェクトは、プロセス内サーバー (DLL) として実装される必要もあります。 これらの制約事項については、OLE Automation Programmer's Reference に概略されています。

LANGUAGE OLE は、 DB2 (Windows 32 ビット オペレーティング・システム版) に保管されているストアード・プロシージャーに対してのみサポートされます。

SQL
指定した SQL-procedure-body には、 ストアード・プロシージャーの処理を定義しているステートメントが組み込まれています。

EXTERNAL
この文節は、この CREATE PROCEDURE ステートメントを使用して登録する新しいプロシージャーが、 外部プログラミング言語で作成されたコードに基づいており、 文書化されたリンケージの規則とインターフェースに従っていることを示します。

NAME 文節の指定がない場合、"NAME procedure-name" が想定されます。

NAME 'string'
この文節は、定義するプロシージャーをインプリメントするユーザー作成コードの名前を指定します。

'string' オプションは、最大 254 文字のストリング定数です。 ストリングに使用される形式は、指定した LANGUAGE によって異なります。

  • LANGUAGE C の場合

    指定する string は、 ライブラリー名と作成しているストアード・プロシージャーを実行するために データベース・マネージャーが呼び出すそのライブラリー中のプロシージャーです。 ライブラリー (およびそのライブラリー中のプロシージャー) は、 CREATE PROCEDURE ステートメントの実行時に存在している必要はありません。 ただし、プロシージャーが呼び出される時点では、 該当のライブラリーとそのライブラリー中の該当のプロシージャーは存在していなければならず、 またデータベース・サーバーのマシンからアクセス可能でなければなりません。

    >>-'--+-library_id-------+---+-------------+---'---------------><
          '-absolute_path_id-'   '-!--proc_id--'
     
    

    名前は、単一引用符で囲む必要があります。 単一引用符内に、余分なブランクを使用することはできません。

    library_id
    該当のプロシージャーが入っているライブラリーの名前を指定します。 データベース・マネージャーは、 .../sqllib/function/unfenced ディレクトリーと .../sqllib/function ディレクトリー (UNIX 系システムの場合)、 または ...\instance_name\function\unfenced ディレクトリーと ...\instance_name\function ディレクトリー (DB2INSTPROF レジストリー変数で指定した OS/2 の Windows 32 ビット オペレーティング・システムの場合) を調べてそのライブラリーを探します。 その中で、データベース・マネージャーは、 データベース・マネージャーの実行に使用されている制御 sqllib ディレクトリーを見つけ出します。 たとえば、UNIX 系システムの制御 sqllib ディレクトリーは、 /u/$DB2INSTANCE/sqllib です。

    UNIX 系システムの library_id が 'myproc' の場合に、 データベース・マネージャーが /u/production から実行されていれば、データベース・マネージャーは ライブラリー /u/production/sqllib/function/unfenced/myfunc と /u/production/sqllib/function/myfunc からプロシージャーを見つけます。

    OS/2 の Windows 32 ビット オペレーティング・システムの場合、関数ディレクトリーで library_id が見つからないと、 データベース・マネージャーは LIBPATH または PATH を調べ、分離 (fenced) として実行されます。

    これらのディレクトリーのいずれかに存在しているストアード・プロシージャーは、 登録済み属性を使用しません。

    absolute_path_id
    プロシージャーの全パス名を指定します。

    たとえば、UNIX 系システムの場合、'/u/jchui/mylib/myproc' を指定すると、 データベース・マネージャーは /u/jchui/mylib を調べて myproc プロシージャーを探索します。

    OS/2 の場合、Windows 32 ビット オペレーティング・システムの 'd:\mylib\myproc' を指定すると、データベース・マネージャーは d:\mylib ディレクトリーから myproc.dll ファイルをロードします。

    絶対パスを指定すると、プロシージャーは分離 (fenced) プロシージャーとして実行され、 FENCED または NOT FENCED の属性は無視されます。

    ! proc_id
    呼び出すプロシージャーの入り口点の名前を指定します。 ! は、ライブラリー ID とプロシージャー ID との間の区切り文字です。 ! proc_id を省略すると、 データベース・マネージャーはライブラリーのリンク時に確立されたデフォルトの入り口点を使用します。

    たとえば、UNIX 系システムで 'mymod!proc8' を指定すると、 データベース・マネージャーはライブラリー $inst_home_dir/sqllib/function/mymod を調べて、 そのライブラリー内の入り口点 proc8 を使用します。

    OS/2 の場合、Windows 32 ビット オペレーティング・システムの 'mymod!proc8' を指定すると、 データベース・マネージャーは mymod.dll ファイルをロードして、 そのダイナミック・リンク・ライブラリー (DLL) の proc8() 関数を呼び出します。

    ストリングの形式が正しくない場合には、エラー (SQLSTATE 42878) になります。

    ストアード・プロシージャーの本体は、 マウントされてデータベースのすべての区分で使用可能なディレクトリーに入っていなければなりません。

  • LANGUAGE JAVA の場合

    指定する string には、 作成中のストアード・プロシージャーを実行するためにデータベース・マネージャーが呼び出す、 任意指定の jar ファイル、クラス識別子、およびメソッド識別子が含まれています。 クラス識別子とメソッド識別子は、 CREATE PROCEDURE ステートメントの実行時には存在している必要はありません。 jar_id を指定する場合、識別子は、 CREATE PROCEDURE ステートメントの実行時に存在していなければなりません。 ただし、プロシージャーを呼び出す時点では、 該当のクラス識別子とメソッド識別子が存在し、 データベース・サーバーのマシンからアクセス可能でなければなりません。 そうでない場合、エラー (SQLSTATE 42884) になります。

    >>-'----+----------+--class_id--+-.-+---method_id--'-----------><
            '-jar_id :-'            '-!-'
     
    

    名前は、単一引用符で囲む必要があります。 単一引用符内に、余分なブランクを使用することはできません。

    jar_id
    jar の集合をデータベースへインストールしたときに、 その jar の集合に付けられた jar 識別子を指定します。 これは、単純識別子またはスキーマ修飾識別子のいずれかにすることができます。 たとえば、'myJar' や 'mySchema.myJar' のようになります。

    class_id
    Java オブジェクトのクラス識別子を指定します。 クラスがパッケージの一部である場合、 クラス識別子の一部に完全なパッケージ接頭部 (たとえば、 'myPacks.StoredProcs') が含まれている必要があります。 Java 仮想マシンは、 ディレクトリー '../myPacks/StoredProcs/' の中のクラスを探します。 OS/2 および Windows 32 ビット オペレーティング・システムでは、 Java 仮想マシンはディレクトリー '..\myPacks\StoredProcs\' を探索します。

    method_id
    呼び出す Java クラスのメソッド名を指定します。
  • LANGUAGE OLE の場合

    指定するストリングは、 ステートメントが作成しているストアード・プロシージャーを実行するためにデータベース・マネージャーが 呼び出す OLE のプログラム識別子 (progid) またはクラス識別子 (clsid)、 およびメソッド識別子 (method_id) です。 プログラム識別子またはクラス識別子、およびメソッド識別子は、 CREATE PROCEDURE ステートメントの実行時に存在している必要はありません。 ただし、関数を CALL ステートメントで使用する時点で、 メソッド識別子は存在していなければならず、 データベース・サーバーのマシンからアクセス可能でなければなりません。 そうでない場合、エラー (SQLSTATE 42724) になります。

    >>-'--+-progid-+---!--method_id--'-----------------------------><
          '-clsid--'
     
    

    名前は、単一引用符で囲む必要があります。 単一引用符内に、余分なブランクを使用することはできません。

    progid
    OLE オブジェクトのプログラム識別子を指定します。

    progid は、データベース・マネージャーには解釈されず、 実行時に OLE に転送されるだけです。 指定する OLE オブジェクトは、作成可能である必要があり、 実行時バインディング (ディスパッチに基づくバインディングとも呼ばれる) をサポートしている必要があります。 規約では、progid は次のような形式になります。

    <program_name>.<component_name>.<version>

    これは規約でしかなく、厳密な規則ではないので、 progids をこれとは異なる形式にしてもかまいません。

    clsid
    作成する OLE オブジェクトのクラス識別子を指定します。 OLE オブジェクトが progid を指定して登録されていない場合に、 progid を指定する代わりに使用することができます。 clsid の形式は次のとおりです。

    {nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn}

    ここで 'n' は英数字です。 clsid は、データベース・マネージャーには解釈されず、 実行時に OLE API に転送されるだけです。

    method_id
    呼び出す OLE オブジェクトのメソッド名を指定します。

NAME identifier
指定する identifier は SQL 識別子です。 SQL 識別子は、ストリングの library-id として使用されます。 区切られた識別子でない場合、識別子は大文字に変換されます。 識別子がスキーマ名で修飾されている場合、スキーマ名の部分は無視されます。 この形式の NAME は、LANGUAGE C でのみ使用可能です。

FENCED または NOT FENCED
この文節は、ストアード・プロシージャーをデータベース・マネージャーの操作環境の プロセスまたはアドレス空間で実行しても "安全" か (NOT FENCED)、 否か (FENCED) を指定します。

ストアード・プロシージャーが FENCED として登録されると、 データベース・マネージャーは、その内部資源 (データ・バッファーなど) を隔離して、 そのプロシージャーからアクセスされないようにします。 すべてのプロシージャーは、 FENCED として実行するか NOT FENCED として実行するかの選択が可能です。 一般に、FENCED として実行されるプロシージャーは、 NOT FENCED として実行されるものと同じようには実行されません。

ストアード・プロシージャーが .../sqllib/function/unfenced ディレクトリー および .../sqllib/function ディレクトリー (UNIX 系システム)、 または ...\instance_name\function\unfenced ディレクトリー および ...\instance_name\function ディレクトリー (OS/2、 Windows 32 ビット オペレーティング・システムの場合) に入っている場合、 FENCED または NOT FENCED の登録属性 (および他のすべての登録属性) は無視されます。
注:十分に検査されていないプロシージャーに NOT FENCED を使用すると、 DB2 の保全性に危険を招く場合があります。 DB2 では、発生する可能性のある一般的な不注意による障害の多くに対して、 いくつかの予防措置がとられていますが、 NOT FENCED ストアード・プロシージャーが使用される場合には、完全な保全性を確保できません。

FENCED から NOT FENCED に変更するには、 プロシージャーを削除して再作成して、再登録する必要があります。 ストアード・プロシージャーを NOT FENCED として登録するには、SYSADM 権限、 DBADM 権限、または特殊な権限 (CREATE_NOT_FENCED) が必要です。 LANGUAGE OLE を指定した関数には、FENCED のみを指定できます。

PARAMETER STYLE
この文節は、ストアード・プロシージャーとの間でパラメーターを渡し、 値を戻すのに用いる規則を指定するのに使用されます。

DB2DARI
ストアード・プロシージャーは、 C 言語の呼び出しおよびリンケージの規則に準拠するパラメーターの受け渡し規則を使用します。 これは、LANGUAGE C を使用する場合にだけ指定することができます。

DB2GENERAL
ストアード・プロシージャーは、 Java メソッドを使用するために定義された規則に従ったパラメーターの受け渡し規則を使用します。 これは、LANGUAGE JAVA を使用する場合にだけ指定することができます。

DB2GENERAL の同義語として値 DB2GENRL が使用可能です。

GENERAL
ストアード・プロシージャーは、パラメーター受け渡しメカニズムを使用します。 ここでは、ストアード・プロシージャーは CALL で指定したパラメーターを受け取ります。 パラメーターは言語ごとに直接に渡されることになっているので、SQLDA 構造は使われません。 これは、LANGUAGE C を使用する場合にだけ、指定することができます。

ヌル標識がプログラムに直接渡されることはありません。

GENERAL の同義語として値 SIMPLE CALL が使用可能です。

GENERAL WITH NULLS
GENERAL で指定した CALL ステートメントのパラメーターに加え、 別の引き数がストアード・プロシージャーに渡されます。 この別の引き数には、CALL ステートメントのパラメーターごとに、 ヌル標識のベクトルが含まれています。 これは、C では short int の配列になります。 これは、LANGUAGE C を使用する場合にだけ、指定することができます。

GENERAL WITH NULLS の同義語として値 SIMPLE CALL WITH NULLS が使用可能です。

DB2SQL
CALL ステートメントのパラメーターに加え、 以下の引き数がストアード・プロシージャーに渡されます。
  • CALL ステートメントの各パラメーターの NULL 標識
  • DB2 へ戻される SQLSTATE
  • ストアード・プロシージャーの修飾名
  • ストアード・プロシージャーの特定名
  • DB2 へ戻される SQL 診断ストリング

これは、LANGUAGE C、COBOL、または OLE を使用する場合にだけ、指定することができます。

JAVA
ストアード・プロシージャーは、 Java 言語および SQLJ ルーチンの仕様に準拠する規則に従ったパラメーターの受け渡し規則を使用します。 IN/OUT および OUT パラメーターは、戻り値を処理するために単一項目配列として渡されます。 これは、LANGUAGE JAVA を使用する場合にだけ指定する必要があります。

PARAMETER STYLE JAVA プロシージャーでは、 DBINFO または PROGRAM TYPE 文節はサポートされていません。

パラメーターの受け渡しの詳細については、アプリケーション開発の手引き を参照してください。

PROGRAM TYPE
ストアード・プロシージャーでのパラメーターのスタイルが、 メインルーチンなのかサブルーチンなのかを指定します。

SUB
ストアード・プロシージャーのパラメーターは、別々の引き数として渡されます。

MAIN
ストアード・プロシージャーのパラメーターは、 引き数カウンター、および引き数のベクトルとして渡されます (argc、argv)。 呼び出すストアード・プロシージャーの名前も、"main" となります。 このタイプのストアード・プロシージャーは、独立した実行可能ファイルとは対照的に、 共用ライブラリーと同じ方法で作成する必要があります。

PROGRAM TYPE のデフォルトは SUB です。 PROGRAM TYPE MAIN は、LANGUAGE C または COBOL で、 なおかつ PARAMETER STYLE GENERAL、GENERAL WITH NULLS、または DB2SQL の場合だけ有効です。

DETERMINISTIC または NOT DETERMINISTIC
この文節は、 同一の引き数値に対してプロシージャーが常に同じ結果を戻すか (DETERMINISTIC)、 それとも状態値に依存してプロシージャーの結果が影響を受けるか (NOT DETERMINISTIC) を指定します。 つまり DETERMINISTIC を伴うプロシージャーは、 同じ入力を指定して連続して呼び出した場合に常に同じ結果を戻します。

現在、この文節はストアード・プロシージャーの処理に影響を与えません。

CALLED ON NULL INPUT
CALLED ON NULL INPUT は、ストアード・プロシージャーに常に適用されます。 したがって、引き数がヌル値であるか否かに関係なく、 ストアード・プロシージャーは呼び出されます。 これは、ヌル値を戻す場合も、通常の (ヌル値以外の) 値を戻す場合もあります。 ヌルの引き数値の有無のテストはストアード・プロシージャーが行う必要があります。

値 NULL CALL は、上位互換またはファミリーの互換性のために、 CALLED ON NULL INPUT の同義語として使うことができます。

NO DBINFO または DBINFO
DB2 において既知である特定の情報が呼び出されたときに、 その情報を追加の呼び出し時引き数としてストアード・プロシージャーに渡すか (DBINFO)、 または渡さないか (NO DBINFO) を指定します。 NO DBINFO がデフォルト値です。 DBINFO は、LANGUAGE OLE ではサポートされません (SQLSTATE 42613)。 これは PARAMETER STYLE JAVA、DB2GENERAL、または DB2DARI でもサポートされません。

DBINFO を指定すると、以下の情報を含む構造がストアード・プロシージャーに渡されます。

  • データベース名 - 現在接続されているデータベースの名前。
  • アプリケーション ID - データベースへの接続ごとに確立された、固有のアプリケーション ID。
  • アプリケーション許可 ID - アプリケーション実行時の許可 ID。
  • コード・ページ - データベースのコード・ページを識別します。
  • スキーマ名 - ストアード・プロシージャーには適用されません。
  • 表名 - ストアード・プロシージャーには適用されません。
  • 列名 - ストアード・プロシージャーには適用されません。
  • データベースのバージョン / リリース - ストアード・プロシージャーを呼び出す データベース・サーバーのバージョン、リリース、および修正レベルを識別します。
  • プラットフォーム - サーバーのプラットフォーム・タイプが入ります。
  • 表関数の結果の列番号 - ストアード・プロシージャーには当てはまりません。

構造の詳細、および構造がストアード・プロシージャーにどのようにして渡されるかについては、 アプリケーション開発の手引き を参照してください。

SQL-procedure-body
SQL プロシージャーの本体である SQL ステートメントを指定します。 複合ステートメント内に複数の SQL-procedure-statement を指定することができます。 詳しくは、SQL プロシージャーを参照してください。

例 1: Java で書かれたストアード・プロシージャーのプロシージャー定義を作成します。 このプロシージャーは、パーツ番号を渡されて、パーツの価格と現在入手可能な数量を戻します。

   CREATE PROCEDURE PARTS_ON_HAND (IN  PARTNUM  INTEGER, 
                                   OUT COST     DECIMAL(7,2), 
                                   OUT QUANTITY INTEGER)
          EXTERNAL NAME 'parts.onhand' 
          LANGUAGE JAVA PARAMETER STYLE JAVA

例 2: C で書かれたストアード・プロシージャーのプロシージャー定義を作成します。 このプロシージャーは、アセンブリー番号を渡されて、 アセンブリーを構成するパーツの数とパーツの合計価格、およびパーツ番号、数量、 各パーツの単価をリストする結果セットを戻します。

   CREATE PROCEDURE ASSEMBLY_PARTS (IN  ASSEMBLY_NUM  INTEGER, 
                                    OUT NUM_PARTS     INTEGER, 
                                    OUT COST DOUBLE)
          EXTERNAL NAME 'parts!assembly' 
          DYNAMIC RESULT SETS 1 NOT FENCED
          LANGUAGE C PARAMETER STYLE GENERAL

例 3: 社員の給与の中央値を戻す SQL プロシージャーを作成します。 給与の中央値を超える給与を得ている全社員の氏名、肩書き、および給与の入った結果セットを戻します。

   CREATE PROCEDURE MEDIAN_RESULT_SET
   (OUT medianSalary DOUBLE)
        RESULT SETS 1
        LANGUAGE SQL 
   BEGIN 
        DECLARE v_numRecords INT DEFAULT 1;
        DECLARE v_counter INT DEFAULT 0;
 
        DECLARE c1 CURSOR FOR 
           SELECT CAST(salary AS DOUBLE) 
              FROM staff 
              ORDER BY salary;
        DECLARE c2 CURSOR WITH RETURN FOR 
           SELECT name, job, CAST(salary AS INTEGER)
              FROM staff 
              WHERE salary > medianSalary
              ORDER BY salary;
        DECLARE EXIT HANDLER FOR NOT FOUND
           SET medianSalary = 6666; 
        SET medianSalary = 0;
        SELECT COUNT(*) INTO v_numRecords
           FROM STAFF;
        OPEN c1;
        WHILE v_counter < (v_numRecords / 2 + 1) 
           DO FETCH c1 INTO medianSalary;
           SET v_counter = v_counter + 1;
        END WHILE;
        CLOSE c1;
        OPEN c2;
   END


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]