CREATE PROCEDURE (external) ステートメント

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

呼び出し

このステートメントは、アプリケーション・プログラムに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 これは、DYNAMICRULES の実行動作がパッケージに効力を持つ場合にのみ、動的に準備できる実行可能ステートメントです (SQLSTATE 42509)。

許可

ステートメントの許可 ID によって保持されている特権には、少なくとも以下のいずれかの権限が含まれていなければなりません。
  • プロシージャーの暗黙的または明示的なスキーマ名が存在しない場合は、データベースに対する IMPLICIT_SCHEMA 権限。
  • スキーマに対する CREATEIN 特権 (プロシージャーのスキーマ名が既存のスキーマを指している場合)。
  • スキーマに対する SCHEMAADM 権限 (プロシージャーのスキーマ名が既存のスキーマを参照する場合)。
  • DBADM 権限。
ステートメントの許可 ID が保持する特権には、以下のいずれかの権限も含まれている必要があります。
  • データベースに対する CREATE_EXTERNAL_ROUTINE 権限。
  • SYSADM 権限
  • DB2_ALTERNATE_AUTHZ_BEHAVIOUR レジストリー変数が設定されていて、値 EXTERNAL_ROUTINE_DBADM が含まれている場合は、DBADM 権限。
非 fenced 関数を作成するには、ステートメントの許可 ID が保持する特権に、以下の権限の少なくとも 1 つが含まれている必要があります (OLE DB 外部表関数またはメソッドには適用されません)。
  • データベースに対する CREATE_NOT_FENCED_ROUTINE 権限。
  • SYSADM 権限
  • DB2_ALTERNATE_AUTHZ_BEHAVIOUR レジストリー変数が設定されていて、値 NOT_FENCED_ROUTINE_DBADM が含まれている場合は、DBADM 権限
    注: Db2 11.5.8 セキュリティー特殊ビルド 29133 には、SYSADM 権限と DBADM 権限の両方の暗黙権限に対する変更が含まれています。 デフォルトでは、SYSADM 権限は、DBADM 権限ではなく、暗黙的に CREATE_EXTERNAL_ROUTINE 権限と CREATE_NOT_FENCED_ROUTINE 権限を持ちます。 DB2_ALTERNATE_AUTHZ_BEHAVIOUR レジストリー変数が設定されていて、EXTERNAL_ROUTINE_DBADM または NOT_FENCED_ROUTINE_DBADM のいずれかの値が含まれている場合、DBADM 権限も暗黙的にこれらの特権を持ちます。

構文

Read syntax diagramSkip visual syntax diagramCREATEOR REPLACE PROCEDUREprocedure-name(,INOUTINOUTparameter-namedata-typedefault-clause)option-list
data-type
Read syntax diagramSkip visual syntax diagrambuilt-in-typearray-type-name
built-in-type
Read syntax diagramSkip visual syntax diagramSMALLINTINTEGERINTBIGINTDECIMALDECNUMERICNUM(5,0)( integer,0, integer)FLOAT(53)( integer)REALDOUBLEPRECISIONCHARACTERCHAR(1)( integerOCTETSCODEUNITS32)VARCHARCHARACTERCHARVARYING( integerOCTETSCODEUNITS32)FOR BIT DATA1CLOBCHARACTERCHARLARGE OBJECT(1M)( integerKMGOCTETSCODEUNITS32)GRAPHIC(1)( integerCODEUNITS16CODEUNITS32)VARGRAPHIC( integerCODEUNITS16CODEUNITS32)DBCLOB(1M)( integerKMGCODEUNITS16CODEUNITS32)BINARY(1)( integer)VARBINARYBINARY VARYING(integer)BLOBBINARY LARGE OBJECT(1M)( integerKMG)DATETIMETIMESTAMPXMLSYSPROC.DB2SECURITYLABEL23
default-clause
Read syntax diagramSkip visual syntax diagramDEFAULT NULLconstantspecial-registerglobal-variable(expression)
option-list
Read syntax diagramSkip visual syntax diagramLANGUAGE CJAVACOBOLCLROLE SPECIFICspecific-nameDYNAMIC RESULT SETS 0DYNAMIC RESULT SETSintegerMODIFIES SQL DATANO SQLCONTAINS SQLREADS SQL DATANOT DETERMINISTICDETERMINISTICCALLED ON NULL INPUT OLD SAVEPOINT LEVELNEW SAVEPOINT LEVELEXTERNAL NAME'string'identifier FENCEDFENCEDTHREADSAFENOT THREADSAFENOT FENCEDTHREADSAFE COMMIT ON RETURN NOCOMMIT ON RETURN YESAUTONOMOUS EXTERNAL ACTIONNO EXTERNAL ACTION INHERIT SPECIAL REGISTERS PARAMETER STYLE DB2GENERALDB2SQLGENERALGENERAL WITH NULLSJAVASQL PARAMETER CCSIDASCIIUNICODEPROGRAM TYPESUBMAINNO DBINFODBINFOSTAY RESIDENT NO
Notes:
  • 1 The FOR BIT DATA clause can be specified in any order with the other column constraints that follow. The FOR BIT DATA clause cannot be specified with string units CODEUNITS32 (SQLSTATE 42613).
  • 2 DB2SECURITYLABEL is the built-in distinct type that must be used to define the row security label column of a protected table.
  • 3 For a column of type DB2SECURITYLABEL, NOT NULL WITH DEFAULT is implicit and cannot be explicitly specified (SQLSTATE 42842). The default value for a column of type DB2SECURITYLABEL is the session authorization ID's security label for write access.

説明

OR REPLACE
プロシージャーの定義が現行のサーバー上に存在している場合に、そのプロシージャーの定義を置換するために指定します。 既存の定義は、新しい定義がカタログ内で置換される前に効率的にドロップされます。ただし、プロシージャーに対して付与された特権は影響を受けないという例外があります。 このオプションは、オブジェクトの所有者しか指定できません。 このオプションは、プロシージャーの定義が現行のサーバー上に存在しない場合は無視されます。 既存のプロシージャーを置換するには、新規定義の特定名およびプロシージャー名が旧定義の特定名とプロシージャー名と同じであるか、または新規定義のシグニチャーが旧定義のシグニチャーと一致していなければなりません。 それ以外の場合は、新規プロシージャーが作成されます。
procedure-name
定義するプロシージャーの名前を指定します。 この名前は、プロシージャーを指定する修飾または非修飾の名前です。 procedure-name の非修飾形式は SQL ID です。 動的 SQL ステートメントでは、CURRENT SCHEMA 特殊レジスターが、 修飾子のないオブジェクト名の修飾子として使用されます。 静的 SQL ステートメントでは、QUALIFIER プリコンパイル/BIND オプションにより、 修飾子のないオブジェクト名の修飾子が暗黙指定されます。 修飾形式は、schema-name の後にピリオドと SQL ID が続きます。

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

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

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

1 つのスキーマに同じ名前の 2 つのプロシージャーがある場合、 パラメーターの数をまったく同一にすることはできません。 シグニチャーが重複していると、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 番目のステートメントは失敗します。 その理由は、データ・タイプが異なっていてもプロシージャーのパラメーターの数が同じだからです。

プロシージャーによってエラーが戻される場合、OUT パラメーターは未定義で、INOUT パラメーターは未変更です。

IN
パラメーターをプロシージャーの入力パラメーターとして指定します。 プロシージャー内でパラメーターに加えられるすべての変更は、 制御が戻されると SQL アプリケーションの呼び出しは行えなくなります。 デフォルトは IN です。
OUT
パラメーターをプロシージャーの出力パラメーターとして指定します。
INOUT
パラメーターを、プロシージャーの入力および出力パラメーターの両方として指定します。
parameter-name
パラメーターの名前を任意に指定します。 パラメーター名は、プロシージャーでユニークでなければなりません (SQLSTATE 42734)。
data-type
パラメーターのデータ・タイプを指定します。 構造化タイプは指定できません (SQLSTATE 429BB)。
組み込みタイプ (built-in-type)
組み込みデータ・タイプを指定します。 各組み込みデータ・タイプの詳細な説明は、『CREATE TABLE』を参照してください。 プロシージャーの作成に使用されている言語に対応するものがある組み込みデータ・タイプのみ指定できます。
  • 日時タイプのパラメーターは文字データ・タイプとして受け渡され、そのデータは ISO 形式で受け渡されます。
  • XML は、LANGUAGE OLE では無効です。
  • プロシージャー内で見られる XML 値は、プロシージャー呼び出しでパラメーターとして渡される XML 値をシリアライズしたバージョンであるため、タイプ XML のパラメーターは構文 XML AS CLOB(n) を使用して宣言する必要があります。
  • CLR は 28 より大きい DECIMAL スケールをサポートしていません (SQLSTATE 42613)。
  • 10 進浮動小数点は、言語 C、Java™ COBOL、CLR、および OLE ではサポートされていません (SQLSTATE 42613)。
  • BINARY および VARBINARY データ・タイプは、LANGUAGE CLR と OLE では無効です (SQLSTATE 42815)。
配列タイプ名 (array-type-name)
ユーザー定義の配列タイプの名前を指定します。 array-type-name がスキーマ名なしで指定される場合、SQL パスでスキーマを検索することにより、配列タイプは解決されます。 この配列は通常配列でなければならず、プロシージャーは PARAMETER STYLE JAVA 節を使用して定義された Java プロシージャーでなければなりません (SQLSTATE 428H2)
DEFAULT
パラメーターのデフォルト値を指定します。 デフォルト値は、定数、特殊レジスター、グローバル変数、式、またはキーワード NULL にすることができます。 デフォルトとして指定できる特殊レジスターは、列のデフォルトに指定できる特殊レジスターと同じです (『CREATE TABLE』ステートメントの『default-clause』を参照)。 他の特殊レジスターは、式を使用することによってデフォルトとして指定できます。

expression は、『式』で説明されているいずれかのタイプの式とすることができます。 デフォルト値が指定されていない場合、パラメーターにデフォルト値がないため、対応する引数はプロシージャーの呼び出し時に省略できません。 expression の最大サイズは 64K バイトです。

デフォルトの式は、SQL データを変更してはなりません (SQLSTATE 428FL または SQLSTATE 429BL)。 式は、 パラメーターのデータ・タイプに対して割り当ての互換性がなければなりません (SQLSTATE 42821)。

以下の状況では、デフォルトを指定できません。
  • INOUT または OUT パラメーターの場合 (SQLSTATE 42601)
  • ARRAY、ROW、または CURSOR タイプのパラメーターの場合 (SQLSTATE 429BB)
SPECIFIC 特定名
定義するプロシージャーのインスタンスに対する固有名を指定します。 この特定名は、このソース派生プロシージャーを変更する場合、ドロップする場合、 またはこのプロシージャーにコメントを付ける場合に使用することができます。 これは、プロシージャーの呼び出しには使用できません。 specific-name の非修飾形式は SQL ID です。 修飾形式は、schema-name の後にピリオドと SQL ID が続きます。 暗黙または明示の修飾子も含め、その名前が、 アプリケーション・サーバーに存在する別のルーチン・インスタンスを指定するものであってはなりません。 そうでない場合、エラー (SQLSTATE 42710) になります。

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

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

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

DYNAMIC RESULT SETS 整数
プロシージャーから戻される結果セットの上限の見積もりを指定します。
MODIFIES SQL DATA、NO SQL、CONTAINS SQL、READS SQL DATA
このプロシージャーで実行できる SQL ステートメント、またはこのプロシージャーから呼び出されるすべてのルーチンで実行できる SQL ステートメントの種別を指定します。 データベース・マネージャーによって、プロシージャーで実行される SQL ステートメント、およびプロシージャーから呼び出されるすべてのルーチンで実行される SQL ステートメントが、この指定と整合しているかどうかが検査されます。

各ステートメントの種別については、 ルーチンおよびトリガーで実行できる SQL ステートメントを参照してください。

デフォルトは MODIFIES SQL DATA です。

MODIFIES SQL DATA
このプロシージャーは、プロシージャーでサポートされていないステートメント以外の すべての SQL ステートメントを実行できることを指定します (SQLSTATE 38003)。
NO SQL
データ・アクセス種別が NO SQL である SQL ステートメントのみをプロシージャーで実行できるように指定します (SQLSTATE 38001)。
CONTAINS SQL
データ・アクセス種別が CONTAINS SQL または NO SQL であるステートメントのみをプロシージャーで実行できるように指定します (SQLSTATE 38003 または 38004)。
READS SQL DATA
データ・アクセス種別が READS SQL DATA、CONTAINS SQL、または NO SQL であるステートメントをプロシージャーで実行できるように指定します (SQLSTATE 38002、38003、または 42985)。
DETERMINISTIC または NOT DETERMINISTIC
この節は、 同一の引数値に対してプロシージャーが常に同じ結果を戻すか (DETERMINISTIC)、 それとも状態値に依存してプロシージャーの結果が影響を受けるか (NOT DETERMINISTIC) を指定します。 つまり DETERMINISTIC が指定されたプロシージャーは、 連続で同じ入力を指定して呼び出した場合に常に同じ結果を戻します。

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

CALLED ON NULL INPUT
CALLED ON NULL INPUT は、プロシージャーに常に適用されます。 これは、任意の引数が NULL かどうかにかかわりなく、プロシージャーが呼び出されることを意味します。 OUT または INOUT パラメーターは、NULL 値を戻す場合も、通常の (NULL 以外の) 値を戻す場合もあります。 NULL の引数値の有無のテストはプロシージャーで行う必要があります。
OLD SAVEPOINT LEVEL または NEW SAVEPOINT LEVEL
このプロシージャーが、セーブポイント名と影響について新しいセーブポイント・レベルを設定するかどうかを指定します。 OLD SAVEPOINT LEVEL がデフォルトの動作です。 セーブポイント・レベルについて詳しくは、SAVEPOINT ステートメントの説明にある『規則』のセクションを参照してください。
LANGUAGE
この節は必須で、プロシージャーの本体が準拠している言語インターフェース規則を指定するのに使用されます。
C
データベース・マネージャーは、プロシージャーを C プロシージャーであるかのように呼び出します。 プロシージャーは、標準 ANSI C プロトタイプで定義されている C 言語の呼び出し規則およびリンケージ規則に 準拠していなければなりません。
JAVA
これは、データベース・マネージャーが Java クラスのメソッドとしてプロシージャーを呼び出すことを意味します。
COBOL
データベース・マネージャーは、 プロシージャーを COBOL プロシージャーであるかのように呼び出します。
Micro Focus COBOL の場合は、定義するプロシージャーで NOT THREADSAFE を指定する必要があります。
CLR
データベース・マネージャーは、.NET クラス内のメソッドとしてプロシージャーを呼び出します。 現時点では、LANGUAGE CLR は、Windows オペレーティング・システムで実行されるプロシージャーに対してのみサポートされています。 NOT FENCED は CLR ルーチンに指定できません (SQLSTATE 42601)。
OLE
データベース・マネージャーは、OLE 自動化オブジェクトによって公開されたメソッドであるものとしてプロシージャーを呼び出します。 ストアード・プロシージャーは、OLE 自動化データ・タイプと呼び出しメカニズムに準拠している必要があります。 さらに OLE 自動化オブジェクトは、 処理中サーバー (DLL) としてインプリメントされる必要もあります。 これらの制約事項については、「OLE Automation Programmer's Reference」で説明されています。

LANGUAGE OLE は、Windows オペレーティング・システム上で実行されるデータベースに保管されたプロシージャーに対してのみサポートされます。 LANGUAGE OLE を指定したプロシージャーには、THREADSAFE は指定できません (SQLSTATE 42613)。

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

NAME 文節を指定しない場合は、NAME procedure-name が想定されます。 NAME 節のフォーマットが正しくない場合、エラーが戻されます (SQLSTATE 42878)。

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

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

  • LANGUAGE C の場合:

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

    Read syntax diagramSkip visual syntax diagram' library_idabsolute_path_id !proc_id '

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

    ライブラリー ID (library_id)
    該当のプロシージャーが入っているライブラリーの名前を指定します。 データベース・マネージャーは、次のようにしてこのライブラリーを特定します。
    オペレーティング・システム ライブラリー名の場所
    Linux®
    AIX®
    library_id として 'myfunc' が指定され、データベース・マネージャーが /u/production から実行されている場合、データベース・マネージャーは、FENCED が指定されている場合はライブラリー /u/production/sqllib/function/myproc で、NOT FENCED が指定されている場合は /u/production/sqllib/function/unfenced/myproc で、プロシージャーを探します。
    Windows データベース・マネージャーは、環境変数 LIBPATH または PATH に指定されているディレクトリー・パスで関数を探します。

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

    absolute_path_id
    プロシージャーの絶対パス名を指定します。 以下の表に示すとおり、形式はオペレーティング・システムによって異なります。
    オペレーティング・システム 絶対パス名の例
    Linux
    AIX
    値「/u/jchui/mylib/myproc」を指定すると、データベース・マネージャーは /u/jchui/mylibmyproc プロシージャーを探します。
    Windows 値「d:\mylib\myproc.dll」を指定すると、データベース・マネージャーはファイル myproc.dlld:\mylib ディレクトリーからロードします。 絶対パス ID を使用してルーチン本体を識別する場合は、必ず .dll 拡張子を付加してください。
    ! proc_id
    呼び出すプロシージャーの入り口点の名前を指定します。 感嘆符 (!) は、ライブラリー ID とプロシージャー ID との間の区切り文字です。'!proc8' を指定すると、データベース・マネージャーは、absolute_path_id によって指定された場所でライブラリーを探し、そのライブラリー内の入り口点 proc8 を使用します。

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

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

  • LANGUAGE JAVA の場合:

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

    Read syntax diagramSkip visual syntax diagram'jar_id :class_id .! method_id'

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

    jar_id
    jar の集合をデータベースへインストールしたときに、 その jar の集合に付けられた jar ID を指定します。 これは、単純 ID またはスキーマ修飾 ID のいずれかにすることができます。 例えば、'myJar' や 'mySchema.myJar' のようになります。
    クラス ID
    Java オブジェクトのクラス ID を識別します。 クラスがパッケージの一部である場合、 クラス ID の一部に完全なパッケージ接頭部 (例えば、 'myPacks.StoredProcs') が含まれている必要があります。 Java 仮想マシンがクラスを検索するディレクトリーは、以下の表に示すように、オペレーティング・システムによって異なります。
    オペレーティング・システム Java 仮想マシンがクラスを検索するディレクトリー。
    Linux
    AIX
    '.../myPacks/UserProcs/'
    Windows '...\myPacks\UserProcs\'
    メソッド ID
    呼び出す Java クラスを持つメソッド名を識別します。
  • LANGUAGE CLR の場合:

    指定された string は、 作成するプロシージャーを実行するためにデータベース・マネージャーが呼び出す .NET アセンブリー (ライブラリーまたは実行可能モジュール)、 そのアセンブリー内のクラス、およびそのクラス内のメソッドを表します。 モジュール、クラス、およびメソッドは、 CREATE PROCEDURE ステートメントの実行時に存在している必要はありません。 ただし、プロシージャーを呼び出す時点では、 モジュール、クラス、およびメソッドは存在していなければならず、 データベース・サーバーのマシンからアクセス可能でなければなりません。 そうでない場合、エラーが戻されます (SQLSTATE 42284)。

    '/clr' コンパイラー・オプションで管理対象コード拡張を指定してコンパイルされている C++ ルーチンは、 'LANGUAGE C' ではなく 'LANGUAGE CLR' としてカタログする必要があります。 データベース・マネージャーは、必要な実行時の決定を行えるようにするために、.NET インフラストラクチャーがプロシージャー内で使用されていることを認識している必要があります。 .NET インフラストラクチャーを使用するすべてのプロシージャーは、 'LANGUAGE CLR' としてカタログする必要があります。

    Read syntax diagramSkip visual syntax diagram'assembly:class_id !method_id'

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

    アセンブリー
    クラスが配置されている DLL ファイルまたは他のアセンブリー・ファイルを指定します。 ファイル拡張子 (.dll など) まで指定します。 絶対パス名を指定しない場合、ファイルはデータベース・インスタンス・パスの関数ディレクトリー (例えば、C:\Program Data\IBM\Db2\Copy Name) になければなりません。 ファイルがインスタンス関数ディレクトリーのサブディレクトリーにある場合は、絶対パスを指定するのではなく、ファイル名の前にサブディレクトリーを指定することができます。 例えば、インスタンス・ディレクトリーが C:\Program Data\IBM\Db2\Copy Name で、アセンブリー・ファイルが C:\Program Data\IBM\Db2\Copy Name\function\myprocs\mydotnet.dll の場合、アセンブリーの指定は 'myprocs\mydotnet.dll' とするだけで十分です。 このパラメーターの大文字小文字が区別されるかどうかは、ファイル・システムの設定と同じです。
    クラス ID
    呼び出すメソッドが属するアセンブリー内のクラスの名前を指定します。 クラスが名前空間内にある場合は、 クラスだけでなく絶対名前空間も指定することが必要です。 例えば、クラス EmployeeClass が名前空間 MyCompany.ProcedureClasses にあるのであれば、 MyCompany.ProcedureClasses.EmployeeClass をクラスとして指定しなければなりません。 一部の .NET 言語用のコンパイラーはクラスの名前空間としてプロジェクト名を追加するため、 コマンド行コンパイラーと GUI コンパイラーのどちらを使用するかで動作が異なってくるので注意してください。 このパラメーターには、大文字と小文字の区別があります。
    メソッド ID
    指定したクラス内で呼び出されるメソッドを指定します。 このパラメーターには、大文字と小文字の区別があります。
  • LANGUAGE OLE の場合:

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

    Read syntax diagramSkip visual syntax diagram' progidclsid !method_id'

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

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

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

    clsid
    作成する OLE オブジェクトのクラス ID を指定します。 OLE オブジェクトが progid を指定して登録されていない場合に、 progid を指定する代わりに使用することができます。 clsid の形式は次のとおりです。
       {nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn}
    ここで 'n' は英数字です。 clsid は、データベース・マネージャーには解釈されず、 実行時に OLE API に転送されるだけです。
    メソッド ID
    呼び出す OLE オブジェクトのメソッド名を指定します。
NAME ID
指定する identifier は SQL ID です。 SQL ID は、ストリングの library-id として使用されます。 区切られた ID でない場合、ID は大文字に変換されます。 ID がスキーマ名で修飾されている場合、スキーマ名の部分は無視されます。 この形式の NAME は、LANGUAGE C でのみ使用可能です。
FENCED または NOT FENCED
この節は、プロシージャーをデータベース・マネージャーのオペレーティング環境のプロセスまたはアドレス・スペースで実行しても「安全」か (NOT FENCED)、そうでないか (FENCED) を指定します。

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

注意:
適切にコード化、検討、およびテストされていないプロシージャーに NOT FENCED を使用すると、 Db2® データベースの整合性が損なわれる可能性があります。 Db2 データベースでは、発生する可能性のある一般的な不注意による障害の多くに対して、いくつかの予防措置がとられていますが、NOT FENCED ストアード・プロシージャーが使用される場合には、完全な整合性を確保できません。

NOT FENCED 節を指定している場合は、LANGUAGE CLR プロシージャーを作成できません (SQLSTATE 42601)。

THREADSAFE または NOT THREADSAFE
プロシージャーを他のルーチンと同じプロセスで実行しても安全か (THREADSAFE)、 そうでないか (NOT THREADSAFE) を指定します。
プロシージャーが OLE 以外の LANGUAGE で定義される場合:
  • プロシージャーが THREADSAFE として定義されている場合には、 データベース・マネージャーは他のルーチンと同じプロセスにプロシージャーを呼び出すことができます。 一般に、スレッド・セーフになるには、 プロシージャーはどのグローバルあるいは静的データ域をも使用してはなりません。 多くのプログラミング解説書には、スレッド・セーフ・ルーチンの作成に関する説明が含まれています。 FENCED および NOT FENCED プロシージャーの両方を THREADSAFE にすることができます。
  • プロシージャーが NOT THREADSAFE に定義される場合には、 データベース・マネージャーは他のルーチンと同じプロセスにプロシージャーを決して呼び出しません。

FENCED プロシージャーの場合、LANGUAGE が JAVAまたは CLR なら THREADSAFE がデフォルトです。 これ以外のすべての言語の場合は、NOT THREADSAFE がデフォルトです。 プロシージャーが LANGUAGE OLE に定義される場合には、THREADSAFE は指定できません (SQLSTATE 42613)。

NOT FENCED プロシージャーの場合には、THREADSAFE がデフォルトです。 NOT THREADSAFE を指定することはできません (SQLSTATE 42613)。

COMMIT ON RETURN
プロシージャーからの戻り時に、コミットを発行するかどうかを示します。 デフォルトは NO です。
いいえ
プロシージャーからの戻り時に、コミットを発行しません。
はい
正の SQLCODE が CALL ステートメントによって戻された場合は、プロシージャーからの戻り時にコミットが発行されます。

コミット操作には、呼び出し側のアプリケーション・プロセスとプロシージャーによって実行される処理が組み込まれています。

プロシージャーが結果セットを戻す場合、この結果セットに関連付けられているカーソルは、コミットの後に使用可能になるように WITH HOLD で定義されていなければなりません。

AUTONOMOUS
プロシージャーが、それ自体の自律型トランザクション・スコープ内で実行することを示します。
EXTERNAL ACTION または NO EXTERNAL ACTION
プロシージャーが、データベース・マネージャーによって管理されていないオブジェクトの状態を変更するアクションを取るか (EXTERNAL ACTION)、 または取らないか (NO EXTERNAL ACTION) を指定します。 デフォルトは EXTERNAL ACTION です。 NO EXTERNAL ACTION を指定した場合、 プロシージャーが外部に影響を与えないことを前提とした最適化を、システムは使用できます。
INHERIT SPECIAL REGISTERS
このオプション節は、プロシージャーの更新可能な特殊レジスターが、 呼び出しステートメントの環境からの初期値を継承するよう指定します。

特殊レジスターに対する変更が、プロシージャーの呼び出し元に戻されることはありません。

更新不能の特殊レジスター (日時特殊レジスターなど) は、 現在実行中のステートメントのプロパティーを反映するので、デフォルト値に設定されます。

PARAMETER STYLE
この節は、プロシージャーにパラメーターを渡し、 プロシージャーから値を戻すのに用いる規則を指定するために使用します。
DB2GENERAL
これは、プロシージャーが、Java メソッドで使用するために定義されたパラメーター引き渡し規則を使用することを意味します。 これは、LANGUAGE JAVA を使用する場合にだけ指定できます。
DB2SQL
CALL ステートメントのパラメーターの他に、以下の引数がプロシージャーに渡されます。
  • CALL ステートメントの各パラメーターの NULL 標識を含むベクトル
  • データベース・マネージャーへ戻される SQLSTATE
  • プロシージャーの修飾名
  • プロシージャーの特定名
  • データベース・マネージャーへ戻される SQL 診断ストリング

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

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

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

GENERAL WITH NULLS
GENERAL で指定した CALL ステートメントのパラメーターの他に、別の引数がプロシージャーに渡されます。 この別の引数は、CALL ステートメントの各パラメーター用の、NULL 標識のベクトルです。 これは、C では短精度整数の配列になります。 これは、LANGUAGE C、COBOL、または CLR を使用する場合にだけ、指定することができます。
JAVA
これは、プロシージャーが、Java 言語および SQLJ ルーチンの仕様に準拠するパラメーター引き渡し規則を使用することを意味します。 IN/OUT および OUT パラメーターは、戻り値を処理するために単一項目配列として渡されます。 これは、LANGUAGE JAVA を使用する場合にだけ指定できます。

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

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

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

PARAMETER CCSID
プロシージャーとやり取りされるすべてのストリング・データに使用されるコード化スキームを指定します。 PARAMETER CCSID 節を指定しない場合のデフォルトは、 Unicode データベースでは PARAMETER CCSID UNICODE、 他のすべてのデータベースでは PARAMETER CCSID ASCII になります。
ASCII
ストリング・データがデータベース・コード・ページでエンコードされることを指定します。 データベースが Unicode データベースの場合は、 PARAMETER CCSID ASCII を指定することはできません (SQLSTATE 56031)。 プロシージャーが呼び出されるときのアプリケーション・コード・ページはデータベース・コード・ページです。
UNICODE
ストリング・データが Unicode でエンコードされることを指定します。 データベースが Unicode データベースの場合、文字データは UTF-8、 GRAPHIC データは UCS-2 になります。 データベースが Unicode データベースでない場合は、文字データは UTF-8 になります。 いずれの場合も、プロシージャーが呼び出されるときのアプリケーション・コード・ページは 1208 です。

データベースが Unicode データベースではないのに、PARAMETER CCSID UNICODE を指定したプロシージャーを作成すると、そのプロシージャーは GRAPHIC タイプ、XML タイプ、またはユーザー定義タイプを取ることができません (SQLSTATE 560C1)。

データベースが Unicode ではなく、 データベース構成に代替照合シーケンスが指定されている場合、 PARAMETER CCSID ASCII または PARAMETER CCSID UNICODE を指定したプロシージャーを作成できます。 プロシージャーとやり取りされるすべてのデータは、 適切なコード・ページに変換されます。

この節を LANGUAGE OLE、LANGUAGE JAVA、または LANGUAGE CLR とともに指定することはできません (SQLSTATE 42613)。

PROGRAM TYPE
プロシージャーでのパラメーターのスタイルが、メインルーチンなのかサブルーチンなのかを指定します。 デフォルトは SUB です。
SUB
プロシージャーのパラメーターは、別々の引数として渡されます。
MAIN
プロシージャーのパラメーターは、引数カウンター、および引数のベクトルとして渡されます (argc、argv)。 呼び出すプロシージャーの名前も、"main" となります。 このタイプのストアード・プロシージャーは、独立した実行可能ファイルではなく、 共有ライブラリーと同じ方法で作成する必要があります。 PROGRAM TYPE MAIN は、 LANGUAGE 節に C、COBOL、または CLR のいずれかが指定されている場合にのみ有効です。
DBINFO または NO DBINFO
データベース・マネージャーにおいて既知である特定の情報が呼び出されたときに、 その情報を追加の呼び出し時引数としてプロシージャーに渡すか (DBINFO)、 または渡さないか (NO DBINFO) を指定します。 NO DBINFO がデフォルト値です。 DBINFO は、LANGUAGE OLE ではサポートされません (SQLSTATE 42613)。 これは PARAMETER STYLE JAVA、または DB2GENERAL でもサポートされません。
DBINFO を指定すると、以下の情報を含む構造がプロシージャーに渡されます。
  • データベース名 - 現在接続されているデータベースの名前。
  • アプリケーション ID - データベースへの接続ごとに確立された、固有アプリケーション ID。
  • アプリケーション許可 ID - データベースに接続したユーザーの許可 ID (SYSTEM_USER 特殊レジスター)。
  • コード・ページ - データベースのコード・ページを識別します。
  • データベースのバージョン/リリース - プロシージャーを呼び出す データベース・サーバーのバージョン、リリース、および修正レベルを識別します。
  • プラットフォーム - サーバーのプラットフォーム・タイプが入ります。
DBINFO 構造はすべての外部ルーチンで共通で、プロシージャーに関係ない追加のフィールドを含みます。

SET SESSION AUTHORIZATION ステートメントを使用してセッション許可 ID (SESSION_USER 特殊レジスター) を変更する場合、アプリケーション許可 ID は引き続き SYSTEM_USER 特殊レジスターの値を戻します。

STAY RESIDENT NO
関数のためにロードしたライブラリーを関数の終了後にメモリー内に残さないことを指定します。 この節は以下の場合に無視されます。
  • NOT FENCED 節を指定した場合。
  • LANGUAGE オプションを JAVA または CLR に設定した場合。

ルール

  • 自律型ルーチンの制約事項: 自律型ルーチンは、結果セットを戻すことができないため、以下のパラメーター・データ・タイプをサポートしません (SQLSTATE 428H2)。
    • カーソル・タイプ
    • 構造化タイプ
    • XML
    自律型の有効範囲内でカーソル・タイプのグローバル変数を参照することはできません。

  • まだ存在していないスキーマ名を用いてプロシージャーを作成すると、 ステートメントの許可 ID に IMPLICIT_SCHEMA 権限がある場合に限り、そのスキーマが暗黙に作成されます。 スキーマの所有者は SYSIBM になります。 スキーマに対する CREATEIN 特権が PUBLIC に付与されます。
  • NOT FENCED として定義されている Java ルーチンは、FENCED THREADSAFE として定義されているかのように呼び出されます。
  • コンパウンド SQL (インライン化) ステートメント内から呼び出されるプロシージャーは、プロシージャー作成時に OLD SAVEPOINT LEVEL が指定またはデフォルト設定されていたとしても、NEW SAVEPOINT LEVEL を指定して作成されたかのように実行されます。
  • PARAMETER STYLE DB2GENERAL 節が指定されている場合、XML パラメーターは、LANGUAGE JAVA 外部プロシージャーでのみサポートされます。
  • デフォルト値の設定: デフォルト値で定義されたプロシージャーのパラメーターは、このプロシージャーの呼び出し時に、それらのデフォルト値に設定されますが、このプロシージャーの呼び出し時に、値が対応する引数に提供されていないか、または DEFAULT で指定されている場合にのみ、このように設定されます。
  • 特権: プロシージャーの定義者は、プロシージャーに対する WITH GRANT OPTION 付きの EXECUTE 特権と、プロシージャーをドロップする権利を常に与えられます。 SQL ステートメントでプロシージャーが使用されるとき、プロシージャーの定義者は、そのプロシージャーによって使用されるすべてのパッケージに対する EXECUTE 特権か、そのプロシージャーによって使用されるパッケージが含まれるスキーマに対する EXECUTEIN 特権を持っている必要があります。
  • 代替構文: Db2 の以前のバージョンとの互換性のために、以下の代替の構文がサポートされています。 およびその他のデータベース製品。 これらの代替は非標準であり、使用すべきではありません。
    • DYNAMIC RESULT SETS の代わりに RESULT SETS を指定できます。
    • CALLED ON NULL INPUT の代わりに NULL CALL を指定できます。
    • DB2GENERAL の代わりに DB2GENRL を指定できます。
    • GENERAL の代わりに SIMPLE CALL を指定できます。
    • GENERAL WITH NULLS の代わりに SIMPLE CALL WITH NULLS を指定できます。
    • PARAMETER STYLE DB2DARI はサポートされています。
    以下の構文はデフォルトの振る舞いとして受け入れられます。
    • ASUTIME NO LIMIT
    • NO COLLID
    • STAY RESIDENT NO
    • Unicode データベースでの CCSID UNICODE
    • PARAMETER CCSID UNICODE が指定されていない場合、非 Unicode データベース内での CCSID ASCII

  • 例 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