CREATE VARIABLE ステートメント
CREATE VARIABLE ステートメントは、セッション・グローバル変数を定義します。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込むか、あるいは対話式に発行することができます。これは、DYNAMICRULES の実行動作がパッケージに効力を持つ場合にのみ、動的に準備できる実行可能ステートメントです (SQLSTATE 42509)。
許可
- データベースに対する IMPLICIT_SCHEMA 権限 (変数の暗黙または明示のスキーマ名が存在しない場合)
- スキーマに対する CREATEIN 特権 (変数のスキーマ名が既存のスキーマを指している場合)
- スキーマに対する SCHEMAADM 権限 (変数のスキーマ名が既存のスキーマを指している場合)
- DBADM 権限
select-statement を使用する cursor-value-constructor を指定してこのステートメントを実行するには、ステートメントの許可 ID が保持する特権に、 select-statement の実行に必要な特権が含まれている必要があります。『SQL 照会』の許可セクションを参照してください。
statement で参照されるオブジェクトに対する権限を検査する際、グループ特権は考慮されません。
既存の変数を置き換えるには、ステートメントの許可 ID が、既存の変数の所有者になっている必要があります (SQLSTATE 42501)。
構文
- 1 data-type1 が CURSOR 組み込みタイプまたは cursor-type-name を指定している場合は、NULL または cursor-value-constructor のみ指定できます。array-type-name または row-type-name には DEFAULT NULL のみ明示的に指定できます。
- 2 FOR BIT DATA 節とその後に続く他の列制約とは、任意の順序で指定できます。FOR BIT DATA 節をストリング単位の CODEUNITS32 とともに指定することはできません (SQLSTATE 42613)。
説明
- OR REPLACE
- 変数が現行サーバーに存在する場合に、その変数の定義を置き換えるように指定します。 既存の定義は、カタログ内で新しい定義が置き換えられる前に事実上ドロップされますが、例外として、その変数に付与された特権には影響を与えません。 このオプションは、変数の定義が現行サーバーに存在しない場合には無視されます。 このオプションは、オブジェクトの所有者しか指定できません。
- variable-name
- グローバル変数の名前を指定します。 名前 (暗黙修飾子または明示修飾子を含む) は、現行サーバーに既に存在するグローバル変数を指定するものであってはなりません (SQLSTATE 42710)。修飾子が指定されなければ、暗黙的に現行スキーマが指定されます。グローバル変数名をスキーマ名で明示的に修飾する場合、文字「SYS」で始まるスキーマ名は使用してはなりません (SQLSTATE 42939)。
- data-type1
- グローバル変数のデータ・タイプを指定します。
構造化タイプを指定することはできません (SQLSTATE 42611)。
- built-in-type
- 組み込みデータ・タイプを指定します。BOOLEAN および CURSOR は表に対して指定できません。各組み込みデータ・タイプの詳細な説明については『CREATE TABLE』を参照してください。
FOR BIT DATA は、文字ストリング・データ・タイプの一部として指定することができます。
- BOOLEAN
- Boolean を示します。
- CURSOR
- 基礎となるカーソルへの参照を示します。
- anchored-variable-data-type
- グローバル変数のデータ・タイプを決定するために使用される別のオブジェクトを指定します。
アンカー・オブジェクトのデータ・タイプには、データ・タイプを直接指定する際に (行の場合は行タイプを作成する際に) 適用されるのと同じ制限があります。
- ANCHOR DATA TYPE TO
- データ・タイプの指定にアンカー・データ・タイプを使用することを示します。
- variable-name2
- グローバル変数を指定します。参照される変数のデータ・タイプは、グローバル変数のデータ・タイプとして使用されます。
- table-name.column-name
- 既存の表またはビューの列名を指定します。列のデータ・タイプが、グローバル変数のデータ・タイプとして使用されます。
- ROW OF table-name または view-name
- グローバル変数が、table-name で指定された表、または view-name で指定されたビューの列の名前と列のデータ・タイプに基づく、それぞれの名前とデータ・タイプを持つフィールドの行であることを指定します。グローバル変数のデータ・タイプは、名前の付いていない行タイプです。
- ROW OF cursor-variable-name
- cursor-variable-name で識別されるカーソル変数のフィールド名およびフィールド・データ・タイプを基にした名前とデータ・タイプを含めて、フィールドの行を指定します。指定するカーソル変数は、以下のいずれかのエレメントでなければなりません (SQLSTATE 428HS)。
- 厳密に型付けされたカーソル・データ・タイプのグローバル変数
- すべての結果列が名前指定されている select-statement を指定した CONSTANT 節を使用して作成または宣言された、緩やかに型付けされたカーソル・データ・タイプのグローバル変数
- array-type-name
- ユーザー定義の配列タイプの名前を指定します。array-type-name がスキーマ名なしで指定される場合、SQL パスでスキーマを検索することにより、配列タイプは解決されます。
- cursor-type-name
- カーソル・タイプの名前を指定します。cursor-type-name がスキーマ名なしで指定される場合、SQL パスでスキーマを検索することにより、カーソル・タイプは解決されます。
- distinct-type-name
- 特殊タイプの名前を指定します。宣言された変数の長さ、精度、および位取りは、それぞれ特殊タイプのソース・タイプの長さ、精度、および位取りになります。 distinct-type-name がスキーマ名なしで指定される場合、SQL パスでスキーマを検索することにより、特殊タイプは解決されます。
- REF (type-name)
- 参照タイプを指定します。タイプ名がスキーマ名なしで指定される場合、SQL パスでスキーマを検索することにより、type-name は解決されます。
- row-type-name
- ユーザー定義の行タイプの名前を指定します。変数のフィールドは、行タイプのフィールドです。row-type-name がスキーマ名なしで指定される場合、SQL パスでスキーマを検索することにより、行タイプは解決されます。
- DEFAULT または CONSTANT
- グローバル変数が最初に参照される際に、その値を指定します。
DEFAULT 節または CONSTANT 節の値は、この最初の参照によって決まります。
どちらも指定されない場合、グローバル変数のデフォルトは NULL 値です。
array-type-name または row-type-name の指定時には、DEFAULT NULL のみ明示的に指定できます。
- DEFAULT
- グローバル変数のデフォルトを定義します。デフォルト値は、その変数のデータ・タイプと割り当てに互換性があるものでなければなりません。
- CONSTANT
- グローバル変数の値を、変更できない固定値に指定します。 CONSTANT を使用して定義したグローバル変数は、割り当て演算のターゲットに使用することはできません。 固定値は、その変数のデータ・タイプと割り当てに互換性があるものでなければなりません。
- NULL
- グローバル変数のデフォルト値として NULL を指定します。row-type-name を指定すると、グローバル変数の値は、各フィールドに NULL 値がある行になります。
- constant
- グローバル変数のデフォルト値として定数値を指定します。data-type1 が CURSOR 組み込みタイプまたは cursor-type-name を指定している場合は、constant を指定できません (SQLSTATE 42601)。
- special-register
- グローバル変数のデフォルト値として特殊レジスターの値を指定します。data-type1 が CURSOR 組み込みタイプまたは cursor-type-name を指定している場合は、special-register を指定できません (SQLSTATE 42601)。
- global-variable
- グローバル変数のデフォルト値としてグローバル変数の値を指定します。data-type1 が CURSOR 組み込みタイプまたは cursor-type-name を指定している場合は、global-variable を指定できません (SQLSTATE 42601)。
- cursor-value-constructor
- cursor-value-constructor には、グローバル変数に関連付けられている select-statement を指定します。cursor-value-constructor をカーソル変数に割り当てると、そのカーソル変数の基礎カーソルが定義されます。
- ASENSITIVE または INSENSITIVE
- カーソルが変更に対してアセンシティブかインセンシティブか指定します。詳しくは、『DECLARE CURSOR』を参照してください。デフォルトは ASENSITIVE です。
- ASENSITIVE
- カーソルが、結果表の元になっている行に対する挿入、アップデート、削除操作に可能な限りセンシティブになるよう指定します。これは、select-statement がどれほど最適化されるかによって異なります。このオプションがデフォルトです。
- INSENSITIVE
- カーソルが、結果表の元になっている行に対する挿入、アップデート、削除操作に影響されないように指定します。INSENSITIVE が指定された場合、カーソルは読み取り専用で結果表はカーソルがオープンされる時にマテリアライズされます。結果として、結果表のサイズ、行の順序、および各行の値は、カーソルがオープンされた後は変更されません。 SELECT ステートメントに FOR UPDATE 節を含めることはできませんし、カーソルを位置指定更新または削除に使用することもできません。
- (parameter-declaration, ...)
- 各パラメーターの名前およびデータ・タイプを含む、カーソルの入力パラメーターを指定します。
- parameter-name
- select-statement 内で SQL 変数として使用するためにパラメーターの名前を指定します。この名前は、カーソルの他のすべてのパラメーター名と同じにすることはできません。また、この名前は、列名がパラメーター名の前に解決されるため、select-statement で使用できるすべての列名と同じにならないように選択しなければなりません。
- data-type2
- select-statement で使用されるカーソル・パラメーターのデータ・タイプを指定します。
- built-in-type
- 組み込みデータ・タイプを指定します。各組み込みデータ・タイプの詳細な説明は、『CREATE TABLE』を参照してください。 BOOLEAN および CURSOR 組み込みタイプを指定することはできません (SQLSTATE 429BB)。
- anchored-parameter-data-type
- カーソル・パラメーターのデータ・タイプを決定するために使用される別のオブジェクトを指定します。アンカー・オブジェクトの
データ・タイプには、データ・タイプを直接的に指定する際に適用されるのと同じ制限が課せられます。
- ANCHOR DATA TYPE TO
- データ・タイプの指定にアンカー・データ・タイプを使用することを示します。
- variable-name
- グローバル変数を指定します。参照される変数のデータ・タイプが、カーソル・パラメーターのデータ・タイプとして使用されます。
- table-name.column-name
- 既存の表またはビューの列名を指定します。列のデータ・タイプが、カーソル・パラメーターのデータ・タイプとして使用されます。
- distinct-type-name
- 特殊タイプの名前を指定します。distinct-type-name がスキーマ名なしで指定される場合、SQL パスでスキーマを検索することにより、特殊タイプは解決されます。
- holdability
- コミット操作の結果としてカーソルをクローズすることを回避するかどうかを指定します。詳しくは、『DECLARE CURSOR』を参照してください。デフォルトは WITHOUT HOLD です。
- WITHOUT HOLD
- コミット操作の結果としてカーソルをクローズすることを回避しません。
- WITH HOLD
- 複数の作業単位を通してリソースを維持します。 コミット操作の結果としてカーソルをクローズすることを回避します。
- select-statement
- カーソルの SELECT ステートメントを指定します。 詳しくは、『select-statement』を参照してください。
- statement-name
- カーソルの準備済み select-statement を指定します。準備済みステートメントの説明については『PREPARE』を参照してください。ターゲットのカーソル変数には、厳密に型付けされたユーザー定義のカーソル・タイプのデータ・タイプがあってはなりません (SQLSTATE 428HU)。
- expression
- グローバル変数のデフォルト値として式の値を指定します。式としては、『式』で説明されている任意のタイプの式を使用できます。式は、その変数のデータ・タイプと割り当てに互換性があるものでなければなりません。 式の最大サイズは 64K です。デフォルトの式は、SQL データを変更したり (SQLSTATE 428FL)、外部アクションを実行したり (SQLSTATE 42845) してはなりません。data-type1 が CURSOR 組み込みタイプまたは cursor-type-name を指定している場合は、expression を指定できません (SQLSTATE 42601)。
規則
- アンカー・データ・タイプの使用: アンカー・データ・タイプは次のオブジェクトを参照できません (SQLSTATE 428HS): ニックネーム、型付き表、型付きビュー、式ベースの索引に関連付けられた統計ビュー、宣言済み一時表、緩やかに型付けされたカーソルに関連付けられた行定義、データベース・コード・ページまたはデータベース照合とは異なるコード・ページまたは照合を使用するオブジェクト。
注
- セッション・グローバル変数にはセッション有効範囲があります。 これは、グローバル変数はデータベースでアクティブであるすべてのセッションで使用できますが、それらの値は各セッション専用であるということを意味します。
- 配列、ブール、カーソル、および行グローバル変数のコンテキスト: 配列変数、ブール変数、または行変数であるグローバル変数は、コンパウンド SQL (コンパイル済み) ステートメントまたは SET 変数ステートメント内のみで使用できます。カーソル変数であるグローバル変数は、コンパウンド SQL (コンパイル済み) ステートメント内のみで使用できます。
- 作成時のエラー: デフォルトの式で参照されるオブジェクトが存在しないか無効にマークされている場合、あるいは定義者に、そのオブジェクトへのアクセス権が一時的に付与されていない場合でも、データベース構成パラメーター auto_reval が DISABLED に設定されていなければ、変数は正常に作成されます。 この変数は無効とマークされ、次回に呼び出されたときに再度有効性を確認されます。
- グローバル変数値の有効範囲:
セッション・グローバル変数の値は、現行セッション内で更新されるか、グローバル変数のドロップまたは変更が行われるか、またはアプリケーション・セッションが終了するまで持続します。
この値は COMMIT または ROLLBACK ステートメントの影響を受けません。グローバル変数のデフォルト値を非決定論的なものとし、グローバル変数のデフォルト値が計算される時点に応じて変わるようにすることができます (時刻に対する参照や、表に保管されているデータに対する参照など)。
特にパフォーマンスの目的で広く使用されている技法として、アプリケーションまたは製品に接続のセットを管理させ、トランザクションを任意の接続へ経路指定する、というものがあります。このような場合には、グローバル変数の非デフォルト値、またはグローバル変数の非決定論的な初期デフォルト値への依存を、トランザクションの終わりまでに限る必要があります。このタイプの状態が生じる可能性のある例としては、XA プロトコル、接続プール、接続コンセントレーター、および HADR を使用してフェイルオーバーを行うアプリケーションが含まれます。
- グローバル変数を使用するための特権: このステートメントで作成されたグローバル変数に対する読み書きを試行するには、このアクションの試行で使用する許可 ID にそのグローバル変数への適切な特権があることが必要です。 変数の定義者には暗黙的にその変数へのすべての特権が付与されます。
- デフォルト値の設定: 作成されたグローバル変数は、その指定された有効範囲内で最初に参照される時にそのデフォルト値にインスタンス化されます。 グローバル変数がステートメントで参照される場合、そのステートメントの制御フローとは独立してインスタンス化される点に注意してください。
- 新規に作成されたセッション・グローバル変数の使用: グローバル変数がセッション内で作成された場合、その作業単位がコミットするまで、それを他のセッションで使用することはできません。 ただし、新規グローバル変数は、作業単位がコミットする前にその変数を作成したセッション内では使用できます。
例
- 例 1: セッションで使用するプリンターを指定するためのセッション・グローバル変数を作成します。
CREATE VARIABLE MYSCHEMA.MYJOB_PRINTER VARCHAR(30) DEFAULT 'Default printer' - 例 2: ある従業員が働いている部門を示すセッション・グローバル変数を作成します。
CREATE VARIABLE SCHEMA1.GV_DEPTNO INTEGER DEFAULT ((SELECT DEPTNO FROM HR.EMPLOYEES WHERE EMPUSER = SESSION_USER)) - 例 3: 現行ユーザーのセキュリティー・レベルを示すセッション・グローバル変数を作成します。
CREATE VARIABLE SCHEMA2.GV_SECURITY_LEVEL INTEGER DEFAULT (GET_SECURITY_LEVEL (SESSION_USER)) - 例 4: 指定されたジョブ・タイプの各社員の名前を返すセッション・グローバル変数をカーソルとして STAFF 表に作成します。
結果を部門番号別に並べ替えます。
CREATE VARIABLE STAFFJOBS CURSOR CONSTANT (CURSOR (WHICHJOB CHAR(5)) FOR SELECT NAME, DEPT FROM STAFF WHERE JOB = WHICHJOB ORDER BY DEPT) - 例 5: XML データ・タイプのグローバル変数を作成します。
CREATE VARIABLE MYSCHEMA.CUSTOMER_HISTORY_VAR XML
