CREATE PROCEDURE 文(外部プロシージャ)

CREATE PROCEDURE ステートメントは、現行サーバー上で外部ストアード・プロシージャーを定義します。

CREATE PROCEDURE(外部)の呼び出し

このステートメントは、アプリケーション・プログラムに組み込むか、あるいは対話式に発行することができます。 これは、DYNAMICRULES RUN動作が有効になっている場合にのみ、動的に準備できる実行可能なステートメントです。 詳細は、「Authorization IDs and dynamic SQL」 を参照してください。

CREATE PROCEDURE(外部)の権限

変更の開始暗黙的または明示的スキーマで新規プロシージャーを作成するには、以下に定義されている特権セットに、少なくとも以下の 1 つが含まれている必要があります。変更の終わり

  • スキーマに対する CREATEIN 特権
  • SYSADM または SYSCTRL 権限
  • システム DBADM
  • 変更の開始インストール SYSOPR 権限 (プロセスの現行 SQLID が SYSINSTL に設定されている場合)変更の終わり

スキーマ名と一致する許可 ID には、暗黙的にそのスキーマの CREATEIN 特権があります。

FL 507 プロシージャを置き換えるには、以下に定義されている特権セットに少なくとも次のいずれかが含まれている必要があります。
  • プロシージャーの所有権
  • スキーマに対する DROPIN 特権と CREATEIN 特権の両方
  • システム DBADM 権限
  • SYSCTRL 権限
  • SYSADM 権限
  • インストール SYSOPR 権限 (プロセスの現行 SQLID が SYSINSTL に設定されている場合)

変更の開始プロシージャーの作成に使用される許可 ID にインストール SYSADM 権限またはインストール SYSOPR 権限があり、現行の SQLID が SYSINSTL に設定されている場合、プロシージャーはシステム定義プロシージャーとして識別されます。変更の終わり

LANGUAGEがJAVAであり、EXTERNAL NAME節で JAR名が指定されている場合、特権セットにはJARファイル(Java™アーカイブファイル)に対するUSAGEが含まれていなければなりません。

特権セット: アプリケーション・プログラムにこの ステートメントを組み込む場合、特権セットは、プランまたはパッケージの所有者が持つ特権となります。 所有者がロールである場合、暗黙的なスキーマの一致は適用されず、また、このロールは上にリストした条件のうちのいずれかを満たしていなければなりません。

このステートメントが動的に準備され、かつ、ROLE AS OBJECT OWNER 文節が指定されたトラステッド・コンテキストの中で実行されていない場合、この特権セットは、プロセスの SQL 許可 ID が持つ特権のセットとなります。 スキーマ名がプロセスの SQL 許可 ID と異なる場合、下記の条件のいずれか 1 つが満たされていなければなりません。

  • 特権セットに SYSADM または SYSCTRL 権限が含まれている。
  • プロセスの SQL 許可 ID に、スキーマの CREATEIN 特権がある。

ストアード・プロシージャーの作成に使用される許可 ID には、指定された WLM 環境で実行するプログラムを定義する権限がある必要があります。 詳細については、「WLM環境におけるストアドプロシージャ作成の権限管理 」を参照してください。

また、ストアード・プロシージャーがパラメーターとしてユーザー定義タイプを使用する場合、この許可 ID は、ユーザー定義タイプとして定義されている各パラメーターに対する USAGE 特権を持っている必要があります。

CREATE PROCEDURE (外部) の構文

構文図を読むビジュアルシンタックスダイアグラムをスキップするCREATEOR REPLACEPROCEDUREprocedure-name (,parameter-declaration)option-list

parameter-declaration:

構文図を読むビジュアルシンタックスダイアグラムをスキップするINOUTINOUT1parameter-nameparameter-type
注:
  • 1 REXX ストアドプロシージャでは、OUT 型または INOUT 型のパラメータは1つだけです。 そのパラメーターは、最後に宣言しなければなりません。

parameter-type:

構文図を読むビジュアルシンタックスダイアグラムをスキップするData-typeAS LOCATOR1TABLE LIKEtable-nameview-nameAS LOCATOR
注:
  • 1 AS LOCATOR は、LOB データ型または LOB データ型に基づく独自データ型に対してのみ指定できます。

データ・タイプ:

構文図を読むビジュアルシンタックスダイアグラムをスキップするbuilt-in-typedistinct-type-name

built-in-type:

構文図を読むビジュアルシンタックスダイアグラムをスキップするSMALLINTINTEGERINTBIGINTDECIMALDECNUMERIC(5,0)( 整数整数)FLOAT(53)( 整数)REALDOUBLEPRECISIONDECFLOAT(34)(16)CHARACTERCHAR(1)( 整数)CHARACTERCHARVARYINGVARCHAR( 整数)CCSIDASCIIEBCDICUNICODEFORSBCSMIXEDBITDATACHARACTERCHARLARGE OBJECTCLOB(1M)( 整数KMG)CCSIDASCIIEBCDICUNICODEFORSBCSMIXEDDATAGRAPHIC(1)( 整数)VARGRAPHIC(整数)DBCLOB(1M)( 整数KMG)CCSIDASCIIEBCDICUNICODEBINARY(1)( 整数)BINARY VARYINGVARBINARY( 整数)BINARY LARGE OBJECTBLOB(1M)( 整数KMG)DATETIMETIMESTAMP(6)(整数)WITHOUT TIME ZONEWITH TIME ZONEROWID

option-list: (オプションは任意の順序で指定できます)

構文図を読むビジュアルシンタックスダイアグラムをスキップするSPECIFICprocedure-nameDYNAMIC RESULT SETS 0DYNAMIC RESULT SETS整数PARAMETER1CCSIDASCIIEBCDICUNICODEVARCHAR2NULTERMSTRUCTUREEXTERNAL NAMEストリング3identifier LANGUAGE ASSEMBLECCOBOLJAVAPLIREXX MODIFIES SQL DATAREADS SQL DATACONTAINS SQLNO SQLPARAMETER STYLE SQLPARAMETER STYLEGENERALGENERAL WITH NULLSJAVANOT DETERMINISTICDETERMINISTICNO PACKAGE PATHPACKAGE PATHパッケージパスFENCEDNO DBINFODBINFONO COLLIDCOLLIDcollection-idWLM ENVIRONMENT名前(名前,*)ASUTIME NO LIMITASUTIMELIMIT整数STAY RESIDENT NOSTAY RESIDENT YESPROGRAM TYPESUBMAINSECURITY DB2SECURITYUSERDEFINERSTOP AFTER SYSTEM DEFAULT FAILURESSTOP AFTER整数FAILURESCONTINUE AFTER FAILURERUN OPTIONS実行時オプションCOMMIT ON RETURN NOCOMMIT ON RETURN YES INHERIT SPECIAL REGISTERSDEFAULT SPECIAL REGISTERS CALLED ON NULL INPUT DISALLOW DEBUG MODEALLOW DEBUG MODEDISABLE DEBUG MODE
注:
  • 1 同一の条項は、複数回指定してはならない。
  • 2 VARCHAR句は、LANGUAGE Cが指定された場合のみ指定できます。
  • 3 LANGUAGE JAVAでは、有効な外部Javaルーチン名を使用します。
構文図を読むビジュアルシンタックスダイアグラムをスキップする
external-java-routine-name
構文図を読むビジュアルシンタックスダイアグラムをスキップするjar-name:method-namemethod-signature
jar-name
構文図を読むビジュアルシンタックスダイアグラムをスキップするschema-name.ジャーID
method-name
構文図を読むビジュアルシンタックスダイアグラムをスキップする パッケージID./1クラス ID.!2メソッド ID
method-signature
構文図を読むビジュアルシンタックスダイアグラムをスキップする(, Javaデータ型)
注:
  • 1 スラッシュ(/)は、 Db2 for z/OS® の以前のリリースとの互換性を保つためにサポートされています。
  • 2 感嘆符(!)は、 Db2 ファミリーの他の製品との互換性を保つためにサポートされています。

CREATE PROCEDURE (外部) の説明

変更の開始OR REPLACE変更の終わり
変更の開始FL 507 は、プロシージャが現在のサーバーに存在する場合に、既存の定義が置き換えられることを指定します。 このオプションは、プロシージャーの定義が現行のサーバー上に存在しない場合は無視されます。 指定された名前のプロシージャーが存在する場合、既存のプロシージャーは外部プロシージャーでなければなりません。
プロシージャーが存在する場合、プロシージャーが置き換えられます。 既存の定義は、新規定義がカタログ内で置換される前にドロップされます。ただし、プロシージャーで付与された特権は影響を受けません。 プロシージャーは次のように再作成されます。
  • 既存のコメントは破棄されます
  • プロシージャーの定義を変更できます
  • プロシージャー定義に関連付けられているタイム・スタンプが更新されます。
  • プロシージャーの所有者は変更できます。
  • システム・デフォルト値は、置き換え対象のプロシージャーが最初に定義されたときに、それらのオプションが明示的に指定されていた場合でも、明示的に指定されていないオプションに使用されます。
既存の手順を置き換えるには、以下の条件のいずれかを満たす必要があります
  • プロシージャー名を使用して SPECIFIC 節を指定する必要があります。
  • 新しいプロシージャー定義のシグニチャーは、パラメーター名を除き、既存のプロシージャー定義のシグニチャーと一致する必要があります。
変更の終わり
プロシージャー名

変更の開始ストアード・プロシージャーの名前を指定します。 名前 (暗黙的または明示的修飾子を含む) は、OR REPLACE 文節が指定されていない限り、現行サーバーで既存のストアード・プロシージャーを指定してはなりません。変更の終わり

名前は、区切り ID (「*」) として 指定している場合であっても、単一アスタリスクにすることはできません。

変更の開始

SYSADM'、'SYSIBM'、'SYSIBMADM'、'SYSPROC'、'SYSTOOLS'のいずれかでない限り、スキーマ名を'SYS'で始めることはできない。

スキーマに'SYSIBMADM'または'SYSTOOLS'を使用するには、SYSADMまたはSYSCTRL権限が必要です。

変更の終わり
(パラメータ宣言、…)
ストアード・プロシージャーのパラメーターの数、各パラメーターのデータ ・タイプ、および (オプション) 各パラメーターの名前を指定します。 ストアード・プロシージャーのパラメーターは、 入力専用、出力専用、または入出力両用に使用できます。 プロシージャーによってエラーが戻される場合、OUT パラメーターは未定義で、INOUT パラメーターは未変更です。

Javaプロシージャの数値パラメータを除き、すべてのパラメータはNULL可能です。ただし、SQL/JRT標準に準拠するため、DECIMAL型以外の数値パラメータはNULL不可となります。

IN
パラメーターをプロシージャーの入力パラメーターとして指定します。 プロシージャー内でパラメーターが変更されても、 そのプロシージャーの入り口で指定されるパラメーター値が、呼び出し側の SQL アプリケーションに戻される値となります。

デフォルトは IN です。

OUT
パラメーターをストアード・プロシージャーによって戻される出力パラメーター として識別します。
INOUT
パラメーターを、ストアード・プロシージャーの入出力両方のパラメーターとして 識別します。
パラメーター名
SQL 変数として使用するパラメーターの名前を指定します。 この名前は、このプロシージャーに対する他のどの parameter-name とも同じにすることはできません。
データ・タイプ
パラメーターのデータ・タイプを指定します。 データ・タイプは、組み込みデータ・タイプまたはユーザー定義タイプにすることができます。

スキーマ名を指定せずにユーザー定義タイプの名前を指定すると、Db2は SQL パス内のスキーマを検索することによって、ユーザー定義タイプを解決します。

一体型
パラメーターのデータ・タイプは組み込みデータ・タイプです。

データ型の詳細については、 組み込み型を参照してください。

文字データ・タイプまたはグラフィック・データ・タイプのパラメーターの場合は、PARAMETER CCSID 文節または CCSID 文節によってパラメーターのコード化スキームを指定します。 これらの文節をいずれも指定しない場合、コード化スキームはインストール・パネル DSNTIPF の DEF ENCODING SCHEME フィールドの値です。

型名明確
入力パラメーターのデータ・タイプは特殊タイプです。 パラメーターの長さ、 精度、位取り、サブタイプ、またはコード化スキームの各属性は、いずれも特殊タイプのソース・タイプの属性です。

文字データ・タイプの入力パラメーターにはサブタイプ (BIT、SBCS、または MIXED) が 暗黙的または明示的に指定されていますが、CALL ステートメントの入力引数 で実際に渡される値は、任意のサブタイプを持つ場合があります。 したがって、プロシージャーが呼び出されると、入力データからパラメーターのサブタイプへの変換が起こる場合があります。 ASCII また は EBCDIC では、実際に DBCS 文字を含む混合データを SBCS サブタイプで宣言されている入力パラメーターの値に使用すると、エラーが起こります。

日時データ・タイプまたは特殊タイプのパラメーターは、異なるデータ・タイプとして 関数に渡されます。

  • 日時タイプ・パラメーターは文字データ・タイプとして渡され、データは ISO 形式 で渡されます。

    日時タイプ・パラメーターのコード化スキームは、任意の文字ストリングまたはグラフィック・ストリング・パラメーターの暗黙的または明示的に指定されたコード化スキームと同じです。 文字またはグラフィック・ストリング・パラメーターが渡されない場合、コード化スキームは、 インストール・パネル DSNTIPF の DEF ENCODING SCHEME フィールドの値になります。

  • 特殊タイプのパラメーターは、特殊タイプのソース・タイプとして受け渡されます。
AS LOCATOR
パラメーターの実際の値の代わりに、値に対するロケーターがプロシージャーに渡されることを指定します。 AS LOCATOR は、LOB データ・タイプ、または LOB データ・タイプに基づく特殊タイプのパラメーターにのみ指定します。 値の代わりにロケーターを渡すと、特にパラメーターの値が非常に大きい場合に、プロシージャーに渡すバイト数を減らすことができます。

AS LOCATOR 文節は、データ・タイプのプロモートが可能かどうかの判別には影響ありません。

TABLE LIKE table-name または view-name AS LOCATOR
パラメーターが遷移表であることを指定します。 ただし、プロシージャーが 呼び出されるときには、遷移表の実際の値はストアード・プロシージャーに渡されません。 代わり に 1 つの値が渡されます。 この 1 つの値は表のロケーターで、プロシージャー はこれを使用して遷移表の列にアクセスします。 表パラメーターを使用する プロシージャーは、トリガーのトリガー・アクションのみから呼び出すことができます。

TABLE LIKE を使用すると、遷移表の暗黙の定義が行われます。 これは、遷移表が指定された表またはビューと同じ数の列を持つことを指定します。 表が指定された場合、その表で暗黙的に非表示と定義された列が遷移表に含まれます。 この列に関するデータ・タイプや、長さ、精度、位取り、 サブタイプ、およびコード化スキームは、これらがカタログ表 SYSCOLUMNS と SYSTABLESPACES に 記述される場合と同様に、指定される表またはビューと同じです。 これらの列の列数と属性は、CREATE PROCEDURE ステートメントが処理される時点で決定されます。 表の列数とこれらの列の属性を後で変更しても、プロシージャーのパラメーターに影響は及びません。

table-name または view-name は、現行サーバーに存在する表またはビューを示すものでなければなりません。 この名前に、宣言済み一時表を指定してはいけません。 指定された表には XML 列を含めることができますが、プロシージャーがこれらの XML 列を参照することはできません。 この名前は、トリガーの遷移表に関連する表と同じ名前である必要はありません。 非修飾の表またはビュー名は、以下の規則に従って暗黙的に修飾されます。

  • CREATE PROCEDURE ステートメントがプログラムに組み込まれている場合、 暗黙的修飾子は、プランまたはパッケージの作成時または最終再バインド時 の QUALIFIER バインド・オプションの許可 ID です。 QUALIFIER を使用しなかった 場合、暗黙的修飾子はプランまたはパッケージ所有者になります。
  • CREATE PROCEDURE ステートメントが動的に準備される場合には、 修飾子は暗黙的に CURRENT SCHEMA 特殊レジスターの SQL 許可 ID となります。

プロシージャーが呼び出されるとき、表ロケーターで識別される遷移表 と TABLE LIKE 文節で識別される表またはビューの対応する列に含まれる定義は、 同じでなければなりません。 これらの列のデータ・タイプ、長さ、精度、位取り、およびコード化スキームは、 完全に一致している必要があります。 CREATE PROCEDURE ステートメントが実行されたときの表またはビューの記述が使用されます。

さらにまた、遷移表の文字 FOR BIT DATA 列を、定義のときに指定された表で対応する列 が文字 FOR BIT DATA として定義されていない、表パラメーターに対する入力として渡すことはできません。 (この定義は、CREATE PROCEDURE ステートメントに出てきます。) 同様に、 FOR BIT DATA でない遷移表の文字列を、定義のときに指定された表の対応する列が、 文字 FOR BIT DATA として定義されている、表パラメーターに対する入力として渡すことはできません。

テーブルロケータの使用に関する詳細は、「ユーザー定義関数またはストアドプロシージャでの移行テーブルへのアクセス 」を参照してください。

変更の開始特定の手続き名変更の終わり
変更の開始FL 507 プロシージャ名をプロシージャの特定の名前として指定します。 この名前は、プロシージャー名と同じでなければなりません。

スキーマ名を指定しない場合、スキーマ名は、プロシージャー名 (procedure-name) の明示的または暗黙的なスキーマ名と同じになります。 スキーマ名を指定する場合は、プロシージャー名の明示的または暗黙的なスキーマ名と同じ名前でなければなりません。

SPECIFIC 文節を指定しない場合は、特定の名前がプロシージャーの名前になります。

以下の状況で既存のプロシージャーを置換する場合は、SPECIFIC 文節を指定します。

  • 既存プロシージャーのパラメーター・リストには、テーブル・パラメーターが含まれています。
  • CREATE ステートメントは、パラメーター名以外のパラメーター・リストに対する変更を指定します。
変更の終わり
FENCED
プロシージャーを外部アドレス・スペースで実行することを指定します。
動的結果セット整数
このストアード・プロシージャーが戻すことができる照会結果セットの最大数を 指定します。 デフォルトは DYNAMIC RESULT SETS 0 で、これは結果セットがないことを示します。 値は0~32767の範囲でなければなりません。
ALLOW DEBUG MODE、DISALLOW DEBUG MODE、 または DISABLE DEBUG MODE
プロシージャーがデバッグ・モードで実行できるかどうかを指定します。 DYNAMICRULES の実行動作が有効状態の場合、そのデフォルトは、CURRENT DEBUG MODE 特殊レジスターの値を使用して判別します。 そうでない場合は、デフォルトは DISALLOW DEBUG MODE です。

LANGUAGE JAVA が有効状態にある場合を除き、このオプションを指定しないでください。

ALLOW DEBUG MODE
JAVA プロシージャーがデバッグ・モードで実行できることを指定します。
DISALLOW DEBUG MODE
JAVA プロシージャーがデバッグ・モードで実行できないことを指定します。

ALTER PROCEDURE ステートメントを使用して、このオプションを ALLOW DEBUG MODE に変更します。

DISABLE DEBUG MODE
JAVA プロシージャーがデバッグ・モードで実行できるないことを指定します。

DISABLE DEBUG MODE を使用してこのプロシージャーの作成または変更を行ってしまうと、ALLOW DEBUG MODE または DISALLOW DEBUG MODE を指定するようにこのプロシージャーを変更できません。 このオプションを変更するには、プロシージャーをドロップし、必要なオプションを使用して再作成する必要があります。

PARAMETER CCSID または PARAMETER VARCHAR
ストリング・パラメーターに対するコード化スキームを指定し、LANGUAGE C のケースでは可変長ストリング・パラメーターのその表記を指定します。
CCSID
文字またはグラフィック・ストリング・パラメーターのコード化スキームが ASCII、EBCDIC、または UNICODE のいずれであるかを指定します。 デフォルトのコード化スキームは、パラメーター・リストの CCSID 文節で指定されている値、またはインストール・パネル DSNTIPF の フィールド DEF ENCODING SCHEME で指定されている値になります。

この文節を使用すると、文字またはグラフィック・ストリング・パラメーターに対してコード化スキーム を容易に指定することができます。 この PARAMETER CCSID 文節のほかに個々のパラメーターに対して 個別に CCSID 文節が指定されている場合、すべての CCSID 文節で指定 されている値が、この文節で指定されている値と同じでなければなりません。

この文節は、メッセージ・トークンおよび DBINFO などのルーチンのシステム生 成パラメーターに使用されるコード化スキームも指定します。

VARCHAR
LANGUAGE C を指定するプロシージャーに対して、可変長文字ストリング ・パラメーター値の表記を指定します。

このオプションを指定できるのは、LANGUAGE C も指定されている場合のみです。

NULTERM
可変長文字ストリング・パラメーターが NUL 終了ストリング形式で 表記されることを指定します。
構造化
可変長文字ストリング・パラメーターが VARCHAR 構造形式で表記されることを指定します。

PARAMETER VARCHAR 文節の使用時、PARAMETER CCSID 指定時のような個々のパラ メーターの VARCHAR 形式を指定する方法はありません。 PARAMETER VARCHAR 文節が適用可能なのは、プロシージャーのパラメーター・リスト内および RETURNS 文節内にあるパラメーターに対してのみです。 PARAMETER VARCHAR 文節は、ルーチンのシ ステム生成パラメーター (メッセージ・トークンおよび DBINFO など) には適用で きません。

データ共用環境では、データ共用グループの全メンバーが PARAMETER VARCHAR 文節をサポートしてからでないと、この文節を指定すべきではありません。 一部のグループ・メンバーがこの文 節をサポートし、残りのメンバーがサポートしない状態で外部ルーチンで PARAMETER VARCHAR を指定すると、そのルーチンは異なるパラメーター形式を検出 することになります。この形式はどのグループ・メンバーがこのルーチンを呼び出 したかによって異なります。

EXTERNAL
CREATE PROCEDURE ステートメントを使用して、外部プログラミング言語によるコードに基づいた新規プロシージャーを定義するように指定します。 NAME 文節を指定しない場合は、「NAME procedure-name」が想定されます。 LANGUAGE JAVAプロシージャでは、既定の名前はJavaプロシージャでは有効ではないため、NAME句が必要です。 場合によっては、デフォルト名は有効ではありません。 名前が無効にならないように、次のタイプのプロシージャーに対しては NAME 文節を指定してください。
  • LANGUAGE JAVA として定義されたプロシージャー
  • 長さ 8 文字を超える名前、下線を含む名前、または通常 ID の規則に準拠しない名前をもつプロシージャー。
名前文字列または識別子
ストアード・プロシージャーをインプリメントするユーザー作成コードを識別します。

LANGUAGE が JAVA の場合、string を単一引用符で囲んで指定する必要が あります。この単一引用符の中に余分なブランクを含めてはなりません。 これは有効な external-java-routine-name を指定する必要があります。 複数の string を指定する場合、これらを合計した長さは 1305 バイト以下でなければならず、またそれぞれをスペースまたは改行によって区切る必要があります。

external-java-routine-name は以下の部分からなります。
jar-name
JAR ファイルをデータベースにインストールしたときに与えた名前を指定します。 この名前は jar-id を含み、オプションとしてスキーマで修飾することができます。 例えば、「myJar」や「mySchema.myJar」です。 修飾しない jar-id は、次の規則にしたがって、スキーマ名により暗黙的に 修飾されます。
  • ステートメントがプログラムに組み込まれる場合、スキーマ名は、パッケージ またはプランが作成されたとき、または最後に再バインドされたときの QUALIFIER バイン ド・オプションの許可 ID です。 QUALIFIER が指定されなかった場合、スキーマ名はパッケージまたは プラン所有者です。
  • このステートメントが動的に準備される場合、スキーマ名は CURRENT SCHEMA 特殊レジスターの SQL 許可 ID です。

jar-name が指定される場合には、それは CREATE PROCEDURE ステートメントの処理時に 存在していなければなりません。 NO SQL も指定されている JAVA プロシージャーに対して jar-name を指定しな いでください。

jar-name が指定されていないと、プロシージャーは JAR ファイルからロード される代わりに、クラス・ファイルから直接ロードされます。 Db2 WLM環境に関連付けられたCLASSPATH内のディレクトリを検索します。 Javaルーチン用の環境変数は、WLM管理ストアドプロシージャのアドレス空間を開始するために使用されるJCLのJAVAENV DDカードで識別されるデータセットで指定されます。

メソッド名
メソッドの名前を指定します。254 バイトを超えてはなりません。 パッケージ、クラス、メソッドのIDはJava固有のものであり、18バイトに限定されるものではありません。 さらに、これらに何が含まれるかは、必ずしも通常の SQL ID の規則と同じではありません。
パッケージID
パッケージを識別します。 package-ids の連結リストは、クラス ID が含まれているパッケージを識別します。 クラスがパッケージの一部である場合、メソッド名には、「myPacks.StoredProcs」のように、完全なパッケージ接頭部を含める必要があります。 Java仮想マシンは、クラスを "/myPacks/StoredProcs/" ディレクトリで検索します。
class-id
Javaオブジェクトのクラス識別子を特定します。
メソッドID
呼び出されるJavaクラスとメソッド識別子を関連付けます。
メソッドシグネチャ
パラメータリストのゼロ個以上のJavaデータタイプのリストを識別し、1024バイトを超えてはならない。 NULL になる可能性がある入力または出力パラメーターを、そのプロシージャーが含む場合には、method-signature を指定します。 作成されたストアドプロシージャが呼び出されると、 Db2 は、正確なメソッド署名を持つ Javaメソッドを検索します。 指定された Javaデータ型要素の数は、Javaメソッドが持つ必要のあるパラメータの数を示しています。

Javaプロシージャにはパラメータを指定できません。 この場合、method-signature には空の括弧の セットを指定します。 Javaメソッドのシグネチャが指定されていない場合、 Db2 は、CREATE PROCEDURE文のパラメータリストで指定されたSQLタイプに関連付けられたデフォルトの JDBC タイプから派生したシグネチャを持つJavaメソッドを検索します。

LANGUAGEの他の値については、MVSロードモジュールの命名規則に従う必要があります。値は8バイト以下でなければならず、アンダースコアを含まないことを除いて、通常の識別子の規則に従う必要があります。

LANGUAGE
この節は必須で、プロシージャーの本体が準拠している言語インターフェース規則を指定するのに使用されます。 すべてのプログラムが、サーバーの環境で実行できるように設計されている必要があります。 アセンブラ、C、COBOL、 PL/I プログラムは、 IBM® の言語環境® で実行できるように設計する必要があります。
ASSEMBLE
ストアード・プロシージャーはアセンブラーで作成されています。
C
ストアード・プロシージャーは C または C++ で作成されています。
COBOL
ストアード・プロシージャーは COBOL (00-COBOL 言語拡張を含む) で作成されています。
JAVA
ストアドプロシージャはJavaで記述され、Java仮想マシンで実行されます。 LANGUAGE JAVA を指定する場合には、 有効な external-java-routine-name を 使用して EXTERNAL NAME 文節も指定する必要があります。また、PARAMETER STYLE を JAVA で指定しなければなりません。 指定されたJavaクラスのパブリックなスタティックメソッドでなければなりません。

DBINFO、PROGRAM TYPE MAIN、または RUN OPTIONS を指定する場合は、LANGUAGE JAVA を指定しないでください。

PLI
ストアード・プロシージャーは PL/I で作成されます。
REXX
ストアドプロシージャはREXXで記述されています。 PARAMETER STYLE SQLが有効な場合は、LANGUAGE REXXを指定しないでください。 REXXが指定されている場合、プロシージャはPARAMETER STYLE GENERALまたはGENERAL WITH NULLSを使用する必要があります。
MODIFIES SQL DATA, READS SQL DATA, CONTAINS SQL、または NO SQL
このルーチンが実行または呼び出すことができる SQL ステートメントおよびネストされたルーチンの分類を指定します。 データベース・マネージャーは、プロシージャーによって発行される SQL ステートメント、およびルーチンによってローカル側で呼び出されるすべてのルーチンが、この指定と一致していることを検証します。ネストされたリモート・ルーチンが呼び出される場合、この検証は実行されません。 各ステートメントの分類については、 ルーチンのSQLステートメント・データ・アクセスの分類を参照のこと。
MODIFIES SQL DATA
プロシージャーでサポートされないステートメントを除き、任意の SQL ステートメントをプロシージャーが実行できるように指定します。
READS SQL DATA
このプロシージャーが、データ・アクセス標識 READS SQL DATA、CONTAINS SQL、または NO SQL を指定したステートメントを実行できるように指定します。 このプロシージャーは、データを変更する SQL ステートメントを実行できません。
CONTAINS SQL
このプロシージャーが、アクセス標識 CONTAINS SQL または NO SQL の SQL ステートメントのみを実行できることを指定します。 このプロシージャーは、データの読み取りまたは変更を行うステートメントを実行できません。
NO SQL
このプロシージャーが、データ・アクセス種別 NO SQL の SQL ステートメントのみを実行できるように指定します。 JAR ファイルを使用 する JAVA プロシージャーに対して NO SQL を指定しないでください。
PARAMETER STYLE
パラメーターをストアード・プロシージャーに渡したり、ストアード・プロシージャーから戻したりするときに使用するリンケージ規約を指定します。 すべてのリンケージ規約は、CALL ステートメントで指定されたパラメーターを含むス トアード・プロシージャーに引数を提供します。 一部のリンケージ規約では、ストアード・プロシージャーに詳しい情報を提供するための追加引数をストアード・プロシージャーに渡します。 リンク規約の詳細については、「外部ストアドプロシージャのリンク規約」 を参照してください。
SQL
CALL ステートメントのパラメーターのほかに、いくつかの追加パラメーターをストアード・プロシージャーに渡すことを指定します。 次のパラメーターが渡されます。
  • CREATE PROCEDURE ステートメントに指定された最初の n 個のパラメーター
  • パラメーターに対する標識変数用の n 個のパラメーター
  • 戻される SQLSTATE
  • ストアード・プロシージャーの修飾名。
  • 個々のストアード・プロシージャー名。
  • Db2に戻される SQL 診断ストリング。
  • DBINFO が指定されている場合は、DBINFO の構造

PARAMETER STYLE SQL がデフォルトです。 LANGUAGE REXX または LANGUAGE JAVA が有効な場合は、PARAMETER STYLE SQL を指定しないでください。

共通事項
ストアード・プロシージャーが CALL ステートメントに指定されたパラメーターのみを受け取るように、ストアード・プロシージャーが使用するパラメーター受け渡しメカニズムを指定します。 このパラメーター・スタイルを指定して定義されたプロシージャーへの引数は、NULL であってはなりません。
GENERAL WITH NULLS
GENERAL に指定された CALL ステートメントのパラメーターのほかに、別の引数もストアード・プロシージャーに渡すことを指定します。 この追加引数は、CALL ステートメントのパラメーターごとに 1 つずつ要素を含む標識配列を格納します。 C の場合、この引数は短精度 INTS の配列です。 標識配列により、ストアード・プロシージャーは NULL パラメーター値を受け入れたり戻したりできます。
JAVA
ストアドプロシージャが、JavaおよびSQLJルーチンの仕様に準拠したパラメータ渡し規約を使用することを指定します。 PARAMETER JAVA は、LANGUAGE が JAVA の場合にのみ指定できます。 LANGUAGE が JAVA の場合、PARAMETER STYLE には JAVA を指定しなければなりません。

INOUT および OUT パラメーターは、単一項目配列として渡されます。 INOUTおよびOUTパラメータは、Javaメソッド内でJava型の単一要素配列として宣言されています。

REXX ストアドプロシージャ(LANGUAGE REXX)では、PARAMETER STYLE の有効な値は GENERAL および GENERAL WITH NULLS のみです。したがって、これらの値のいずれかを指定し、PARAMETER STYLE がデフォルトで SQL にならないようにしてください。
DETERMINISTIC または NOT DETERMINISTIC
ストアード・プロシージャーが同じ IN 引数と INOUT 引数を指定して呼び出されるたびに、このストアード・プロシージャーが同じ結果を戻すかどうかを指定します。
DETERMINISTIC
データベース内の参照データが変更されていなければ、ストアード・プロシージャーが同じ IN 引数と INOUT 引数を指定して呼び出されるたびに、 ストアード・プロシージャーは常に同じ結果を戻します。
NOT DETERMINISTIC
データベース内の参照データが変更されていなくても、ストアード・プロシージャーが同じ IN 引数と INOUT 引数を指定して呼び出されるたびに、 ストアード・プロシージャーは同じ結果を戻さない可能性があります。 NOT DETERMINISTIC がデフォルトです。

Db2は、ストアード・プロシージャー・コードが DETERMINISTIC または NOT DETERMINISTIC の指定と一致していることを検査しません。

NO PACKAGE PATH または PACKAGE PATH package-path
プロシージャーの実行時に使用するパッケージ・パスを指定します。 これは、プロシージャーと関連する DBRM がバインド されていると考えられるパッケージ・コレクションのリストです。
NO PACKAGE PATH
プロシージャー用のパッケージ・コレクションのリストが、呼び出し側プログラムに対するパッケージ・コレクション ID のリストと 同じであることを指示します。 呼び出し側プログラムがパッケージを使用していない場合、Db2は、CURRENT PACKAGE PATH 特殊レジスター、CURRENT PACKAGESET 特殊レジスター、または PKLIST バインド・オプション (この順序で) を使用してパッケージを解決します。 Db2 がこれら3つの項目を使用する方法については、「アプリケーションプランのバインド」 を参照してください。
PACKAGE PATH パッケージパス
SET CURRENT PACKAGE PATH 特殊レジスターと同じ形式で、パッケージ・コレクションのリストを指定します。

COLLID 文節 に PACKAGE PATH を指定すると、その COLLID 文節は、ルーチンの呼び出し時に無視されます。

プロシージャーの作成時に指定される package-path 値は、CALL ステートメントが準備される時にチェックされます。 package-path に SESSION_USER (あるいは USER)、PATH、または PACKAGE PATH が含まれていると、package-path の値が検査されるときにエラーが戻されます。

NO DBINFO または DBINFO
ストアード・プロシージャーを呼び出すときに、追加の状況情報を渡すかどうかを指定します。
NO DBINFO
追加情報は渡されません。 NO DBINFO がデフォルト値です。
DBINFO
ストアード・プロシージャーを呼び出すときに、追加の引数が渡されます。 この引数は、現行サーバーの名前、アプリケーション実行時 許可 ID、およびプロシージャーを呼び出したデータベース・マネージャーのバージョン およびリリースの ID などの情報を含む構造体です。 引数およびその構造の詳細については、 DBINFO構造を参照してください。

DBINFO は、PARAMETER STYLE SQL が指定されている場合だけ指定できます。

NO COLLID または COLLID collection-id
ストアード・プロシージャーの実行時に使用されるパッケージ・コレクションを指定します。 これは、ストアード・プロシージャーと関連する DBRM がバインド されているパッケージ・コレクションです。
NO COLLID
ストアード・プロシージャーのパッケージ・コレクションは、呼び出し側プログラム のものと同じです。 呼び出し側プログラムがパッケージを使用していない場合、Db2は CURRENT PACKAGE PATH 特殊レジスター、CURRENT PACKAGESET 特殊レジスター、または PKLIST バインド・オプション (この順序で) を使用してパッケージを解決します。 Db2 がこれら3つの項目を使用する方法の詳細については、「アプリケーションプランのバインド」のパッケージ解決に関する情報を参照してください。

NO COLLID がデフォルトです。

COLLID collection-id
ストアード・プロシージャーのパッケージ・コレクションは、指定されたものです。

REXX ストアドプロシージャの場合、 コレクションID はDSNREXRR、DSNREXRS、DSNREXCR、またはDSNREXCSとすることができます。

変更の開始これらの条件を満たす Java ストアード・プロシージャーの場合、-collection オプションを指定して DB2Binder ユーティリティーを実行し、COLLID 値で指定されたコレクションにドライバー・パッケージをバインドする必要があります。
  • COLLIDの値は、パッケージがバインドされるコレクションとは異なります。 IBM Data Server Driver for JDBC and SQLJ パッケージがバインドされるコレクションとは異なります。
  • EXTERNAL NAME 節に jar-name が指定されている。
詳しくは、以下のトピックを参照してください。変更の終わり
WLM ENVIRONMENT
Db2ストアード・プロシージャー・アドレス・スペースがWLM によって確立されている場合に、そのストアード・プロシージャーが実行される WLM (ワークロード・マネージャー) 環境を識別します。 WLM 環境の name は SQL ID です。

WLM ENVIRONMENT を使用しない場合、関数はインストール時に指定されたデフォルト WLM が確立した ストアード・プロシージャー・アドレス・スペースで実行されます。

名前
ストアード・プロシージャーを実行すべき WLM 環境。 別のストアード・プロシージャーまたはユーザー定義関数がストアード・プロシージャーを呼び出し、その呼び出しルーチンが、指定された WLM 環境に関連付けられていないアドレス・スペースで実行されている場合、Db2はストアード・プロシージャー要求を別のアドレス・スペースに経路指定します。
(名前,*)
SQL アプリケーション・プログラムがストアード・プロシージャーを 直接呼び出すとき、ストアード・プロシージャーが実行する WLM 環境。

別ストアード・プロシージャーまたはユーザー定義関数がそのストアード・プロシージャーを呼び出すと、 そのストアード・プロシージャーは、呼び出し元ルーチンが使用する同じ WLM 環境で実行されます。

WLM 環境に適切な権限を持っている必要があります。

ASUTIME
ストアード・プロシージャーの 1 回の呼び出しで使用できるプロセッサー時間の合計量を、CPU サービス単位で指定します。 この値は、リソース限定表の ASUTIME 列とは無関係です。 このオプションは、LANGUAGE JAVA が指定されている場合には、無視されます。

ストアード・プロシージャーのデバッグの際には、制限を設けると、ストアード・プロシージャーがループに入り込んだ時に役立ちます。 サービス・ユニットに関する情報は、 z/OS MVS 『Initialization and Tuning Guide 』を参照のこと。

NO LIMIT
サービス単位に制限はありません。 NO LIMIT がデフォルトです。
LIMIT 整数
CPUサービスユニットの数の制限は、1~2147483647の範囲の正の整数です。 プロシージャーが、指定された値より多くのサービス単位を使用する場合、Db2はプロシージャーを取り消します。 プロシージャーの並列タスクによって使用される CPU サイクルは、指定された ASUTIME LIMIT には提供されません。
STAY RESIDENT
ストアード・プロシージャーの終了時に、ストアード・プロシージャーのロード・モジュールをメモリーに常駐させるかどうかを指定します。 このオプションは、LANGUAGE JAVA が指定されている場合には、無視されます。
いいえ
ストアード・プロシージャーの終了後、ロード・モジュールはメモリーから削除されます。 デフォルトはNOです。
はい
ストアード・プロシージャーの終了後、ロード・モジュールはメモリーに常駐します。
PROGRAM TYPE
ストアード・プロシージャーがメインルーチンとして実行されるか、サブルーチンとして実行されるかを指定します。
SUB
ストアード・プロシージャーはサブルーチンとして実行されます。 LANGUAGE JAVA の場合は、PROGRAM TYPE SUB のみが有効なオプションです。
MAIN
ストアード・プロシージャーはメインルーチンとして実行されます。 LANGUAGE REXXでは、プログラムタイプMAINが常に有効です。

PROGRAM TYPE のデフォルトは次のとおりです。

  • MAIN with LANGUAGE REXX
  • LANGUAGE JAVA の場合は SUB
  • その他の言語の場合、デフォルトは CURRENT RULES 特殊レジスターの値によって次のように決まります。
    • 値がDb2の場合は MAIN
    • 値が STD の場合は SUB
セキュリティー
ストアドプロシージャが、 RACF® などの外部セキュリティ製品とどのように連携して、SQL以外のリソースへのアクセスを制御するかを指定します。
Db2
ストアード・プロシージャーには、特殊な外部セキュリティー環境は必要ありません。 外部セキュリティー製品が保護するリソースにストアード・プロシージャーがアクセスする場合、そのアクセスは、ストアード・プロシージャーのアドレス・スペースと関連付けられた許可 ID を使用して実行されます。 Db2がデフォルトです。
ユーザー
ストアード・プロシージャーのために外部セキュリティー環境を設定する必要が あります。 ストアード・プロシージャーが外部セキュリティー製品の保護するリソースにアクセスすると、そのアクセスはストアード・プロシージャーを呼び出したユーザーの許可 ID を使用して実行されます。
DEFINER
ストアード・プロシージャーのために外部セキュリティー環境を設定する必要が あります。 ストアード・プロシージャーが外部セキュリティー製品の保護するリソースにアクセスすると、そのアクセスはストアード・プロシージャーの所有者の許可 ID を使用して実行されます。
STOP AFTER SYSTEM DEFAULT FAILURES、STOP AFTER nn FAILURES、または CONTINUE AFTER FAILURE
一定の数の障害が発生した後、ルーチンを停止状態にするかどうかを指定します。
STOP AFTER SYSTEM DEFAULT FAILURES
インストール・パネル DSNTIPX のフィールド MAX ABEND COUNT の値によって示された回数の障害が発生した後、このルーチンを停止状態にするように指定します。 これはデフォルトです。
nn回失敗したら停止する
nn 回の障害が発生した後、このルーチンを停止状態にするように指定します。 nnの値は、1~32767の整数です。
CONTINUE AFTER FAILURE
どの障害が発生してもこのルーチンを停止状態にしないように指定します。
実行オプション runtime-options
ストアドプロシージャで使用するランタイムオプションを指定します。 REXX ストアドプロシージャの場合、 Db2 への REXX 言語インターフェースに渡されるランタイムオプションを指定します。 runtime-options は、254 バイトを超えない文字ストリングとして指定する必要があります。 RUN OPTIONS を指定しない場合、または空文字列を渡す場合、 Db2 はランタイムオプションを Language Environment に渡さず、Language Environment はインストール時のデフォルト設定を使用します。

LANGUAGE JAVA が有効になっている場合は RUN OPTIONS を指定しないでください。

言語環境のランタイム・オプションについては、 言語環境プログラミング・リファレンスを参照してください。

COMMIT ON RETURN
ストアード・プロシージャーから戻った直後に、Db2がトランザクションをコミットするかどうかを示します。
いいえ
Db2は、ストアード・プロシージャーが戻ったときにコミットを発行しません。 デフォルトはNOです。
はい
Db2は、以下のステートメントが真である場合にストアード・プロシージャーが戻ると、コミットを発行します。
  • CALL ステートメントによって戻された SQLCODE が負でない。
  • ストアード・プロシージャーが打ち切り必須状態でない。

このコミット操作には、アプリケーション・プロセスとストアード・プロシージャーの呼び出しによって実行された作業が含まれます。

ストアード・プロシージャーが結果セットを戻す場合、その結果セットに関連する カーソルは、コミット後に使用できるように、WITH HOLD として定義しておく必要が あります。

INHERIT SPECIAL REGISTERS または DEFAULT SPECIAL REGISTERS
ルーチンに入ったときに特殊レジスターを設定する方法を指定します。 デフォルトは INHERIT SPECIAL REGISTERS です。
INHERIT SPECIAL REGISTERS
特殊レジスタの値が、ユーザー定義関数またはストアド プロシージャ内の特殊レジスタのストアド プロシージャ内の特殊レジスタの特性の表に記載されている規則に従って継承されることを指定します。
DEFAULT SPECIAL REGISTERS
ストアドプロシージャの特殊レジスタの特性に関する表のルールで示されているように、特殊レジスタがデフォルト値に初期化されることを指定します。
CALLED ON NULL INPUT
引数値のいずれかまたはすべてが NULL であっても、プロシージャーを呼び出すように指定します。このため、NULL 引数値のテストを行うようにプロシージャーをコーディングする必要があります。 プロシージャーは、NULL または非 NULL 値を戻すことができます。 CALLED ON NULL INPUT がデフォルトです。

CREATE PROCEDURE(外部)に関する注釈

すべてのタイプのプロシージャーに関する考慮事項
すべてのプロシージャに共通する事項については、「CREATE PROCEDURE ステートメント(概要)」 を参照してください。
文字ストリング表記上の考慮事項

PARAMETER VARCHAR 文節は、C で NUL 終了ストリングをネイティブで使用するため、外部プロシージャーに固有です。 VARCHAR 構造表現は、文字ストリング・データに組み込み NUL 終止符が含まれていることが既知である場合に役立ちます。 また、文字ストリング・データには組み込み NUL 終止符が含まれていないことを保証できない場合も有用です。

PARAMETER VARCHAR は、固定長文字ストリング、VARCHAR FOR BIT DATA、CLOB、 DBCLOB、または暗黙的に生成されたパラメーターには適用できません。 PARAMETER VARCHAR 文節が VARCHAR FOR BIT DATA に適用できない理由は、BIT DATA には X'00' 文字が含まれる可能性が あり、その値の表記が長さ情報で始まるからです。 PARAMETER VARCHAR 文節が LOB データに適用できない理由は、LOB 値の表記が長 さ情報で始まるからです。

PARAMETER VARCHAR は、外部プロシージャーに対して暗黙的に指定されるオ プショナル・パラメーターには適用されません。 例えば、LANGUAGE C に対する CREATE PROCEDURE ステート メントも PARAMETER STYLE SQL を指定する必要があります。これにより SQLSTATE NULL 完了文字ストリングを戻します。すなわち、その SQLSTATE は VARCHAR 構造 化形式で表記されないことになります。 同様に、データベース・マネージャーに戻されるプロシージャ ーの修飾名、プロシージャーの特定名、または SQL 診断ストリングを表すど のパラメーターも、VARCHAR 構造化形式で表されないことになります。

ストアドプロシージャ実行環境
WLM ENVIRONMENT 節を使用して、ストアード・プロシージャーが実行されるアドレス・スペースを識別することができます。 異なる WLM 環境を使用すれば、 プログラムのグループを他のプログラムのグループから分離することができます。 例えば、給与計算アプリケーションは従業員の給与などの機密データを扱うため、 セキュリティーの要件に基づいてプログラムを分離し、すべての給与計算アプリケーション を 1 つの WLM 環境に入れることができます。
ストアドプロシージャが実行される場所に関わらず、 Db2 は RACF を呼び出して、適切な権限があるかどうかを判断します。 指定されたWLM環境または Db2 で確立されたストアドプロシージャのアドレス空間を参照するCREATE PROCEDURE文を発行するには、権限が必要です。 例えば、次の RACF コマンドは、 Db2 ユーザー DB2USER1 に、 Db2 サブシステム DB2A 上で、PAYROLLという名前のWLM環境で実行されるストアドプロシージャを定義する権限を付与します。
  PERMIT  DB2A.WLMENV.PAYROLL  CLASS(DSNR) ID(DB2USER1)  ACCESS(READ)
代替構文およびシノニム
Db2 の以前のリリースや、 Db2 ファミリーの他の製品との互換性を確保するため、 Db2 では以下の代替構文をサポートしています。:
  • DYNAMIC RESULT SET のシノニムとして RESULT SET
  • DYNAMIC RESULT SETS のシノニムとして RESULT SETS
  • DB2SQL のシノニムとして STANDARD CALL
  • GENERAL のシノニムとして SIMPLE CALL
  • GENERAL WITH NULLS のシノニムとして SIMPLE CALL WITH NULLS
  • NOT DETERMINISTIC のシノニムとして VARIANT
  • DETERMINISTIC のシノニムとして NOT VARIANT
  • CALLED ON NULL INPUT のシノニムとして NULL CALL
  • PARAMETER STYLE SQL のシノニムとして PARAMETER STYLE DB2SQL

CREATE PROCEDURE(外部)の例

例 1
COBOL で作成されたストアード・プロシージャーの定義を作成します。 このプロシージャーは、アセンブリーのパーツ番号を受け入れて、アセンブリー を構成するパーツの数、合計パーツ・コスト、および結果セットを戻します。 結果セットにはパーツ番号、数量、および各パーツの単位コストがリストされて います。 入力パラメーターには NULL 値を入れることができず、プロシージャー は PARTSA と呼ばれる WLM 環境で実行されるとします。
  CREATE PROCEDURE SYSPROC.MYPROC(IN INT, OUT INT, OUT DECIMAL(7,2))
         LANGUAGE COBOL
         EXTERNAL NAME MYMODULE
         PARAMETER STYLE GENERAL
         WLM ENVIRONMENT PARTSA
         DYNAMIC RESULT SETS 1;    
例 2
例 1 で説明されているストアード・プロシージャーの定義を作成します。ただし、CALL ステートメントで指定されたパラメーターより多くの情報を渡すリンケージ規則を使用します。 言語環境の実行時オプションとして、HEAP、BELOW、 ALL31、STACKを指定します。
  CREATE PROCEDURE SYSPROC.MYPROC(IN INT, OUT INT, OUT DECIMAL(7,2))
         LANGUAGE COBOL
         EXTERNAL NAME MYMODULE
         PARAMETER STYLE SQL
         WLM ENVIRONMENT PARTSA
         DYNAMIC RESULT SETS 1
         RUN OPTIONS 'HEAP(,,ANY),BELOW(4K,,),ALL31(ON),STACK(,,ANY,)';
例 3
部品番号が渡され、その部品のコストと現在利用可能な数量を返す、Javaで書かれたストアドプロシージャのプロシージャ定義を作成します。
  CREATE PROCEDURE PARTS_ON_HAND(IN PARTNUM INT, 
                                 OUT COST DECIMAL(7,2), 
                                 OUT QUANTITY INT)
         LANGUAGE JAVA
         EXTERNAL NAME 'PARTS.ONHAND'
         PARAMETER STYLE JAVA;