CREATE VARIABLE
CREATE VARIABLE ステートメントは、アプリケーション・サーバーでグローバル変数を定義します。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込むことも、 あるいは対話式に実行することもできます。 これは、動的に準備できる実行可能ステートメントです。
権限
このステートメントの権限 ID が保持する特権には、少なくとも以下の 1 つ が含まれていなければなりません。
- スキーマ内に作成する特権。詳しくは、スキーマ内で作成する必要のある権限を参照してください。
- データベース管理者権限
このステートメントの権限 ID が保持する特権には、少なくとも以下の 1 つ が含まれていなければなりません。
- SYSVARIABLES カタログ表の場合
- 該当の表に対する INSERT 特権、および
- QSYS2 ライブラリーに対する *EXECUTE システム権限
- データベース管理者権限
特殊タイプまたはシーケンスを参照する場合は、ステートメントの権限 ID によって保持される特権に、少なくとも次のいずれか 1 つが含まれなければなりません。
- ステートメント内で識別される特殊タイプまたはシーケンスに対しては次のもの。
- その特殊タイプまたはシーケンスに対する USAGE 特権、および
- その特殊タイプまたはシーケンスを含むライブラリーに対する *EXECUTE システム権限
- データベース管理者権限
関数を参照する場合は、ステートメントの権限 ID によって保持される特権に、少なくとも次のいずれか 1 つが含まれなければなりません。
- ステートメント内で識別される関数に対しては次のもの。
- その関数に対する EXECUTE 特権、および
- 関数が入っているライブラリーに対する *EXECUTE システム権限
- データベース管理者権限
グローバル変数を参照する場合は、ステートメントの権限 ID によって保持される特権に、少なくとも次のいずれか 1 つが含まれなければなりません。
- ステートメント内で識別されるグローバル変数に対しては次のもの。
- そのグローバル変数に対する READ 特権
- そのグローバル変数を含むライブラリーに対する *EXECUTE システム権限
- データベース管理者権限
表またはビューを直接または間接的に参照する場合は、ステートメントの権限 ID によって保持される特権に、少なくとも次のいずれか 1 つが含まれなければなりません。
- 直接的または間接的に参照されている表/ビューごとに、以下の権限が必要です。
- 表やビューに対する SELECT 特権、および
- 表やビューが入っているライブラリーに対する *EXECUTE システム権限
- データベース管理者権限
既存の変数に置き換えるには、ステートメントの権限 ID が保持する特権に、次のうち少なくともいずれか 1 つを含める必要があります。
- 次のシステム権限
- この変数のサービス・プログラムに対する *OBJMGT システム権限
- この変数を削除するために必要な全権限
- SYSVARIABLES カタログ表に対する *READ システム権限
- データベース管理者権限
SQL 特権に対応するシステム権限の説明については、『シーケンスへの権限を検査する際の対応するシステム権限』および 『特殊タイプへの権限を検査する際の対応するシステム権限』を参照してください。
構文
>>-CREATE--+------------+--VARIABLE--variable-name--------------> '-OR REPLACE-' >--+-------------------------------------------+--data-type-----> '-FOR SYSTEM NAME--system-object-identifier-' .-DEFAULT NULL------------------. >--+-------------------------------+--------------------------->< '-DEFAULT--+-constant---------+-' +-special-register-+ +-global-variable--+ '-(--expression--)-'
data-type |--+-built-in-type------+---------------------------------------| '-distinct-type-name-'
built-in-type |--+-+---SMALLINT---+--------------------------------------------------------------------------+--| | +-+-INTEGER-+--+ | | | '-INT-----' | | | '---BIGINT-----' | | .-(5,0)------------------------. | +-+-+-DECIMAL-+-+--+------------------------------+-----------------------------------------+ | | '-DEC-----' | | .-,0--------. | | | '-+-NUMERIC-+-' '-(--integer--+-----------+--)-' | | '-NUM-----' '-, integer-' | | .-(--53--)------. | +-+-FLOAT--+---------------+-+--------------------------------------------------------------+ | | '-(--integer--)-' | | | +-REAL---------------------+ | | | .-PRECISION-. | | | '-DOUBLE--+-----------+----' | | .-(--34--)-. | +---DECFLOAT--+----------+------------------------------------------------------------------+ | '-(--16--)-' | | .-(--1--)-------. | +-+-+-+-CHARACTER-+--+---------------+----------+--+----------------+---------------------+-+ | | | '-CHAR------' '-(--integer--)-' | +-FOR BIT DATA---+ | | | | '-+-+-CHARACTER-+--VARYING-+--(--integer--)-' +-FOR SBCS DATA--+ | | | | | '-CHAR------' | +-FOR MIXED DATA-+ | | | | '-VARCHAR----------------' '-ccsid-clause---' | | | | .-(--1M--)-------------. | | | '-----+-+-CHARACTER-+--LARGE OBJECT-+------+----------------------+--+----------------+-' | | | '-CHAR------' | '-(--integer--+---+--)-' +-FOR SBCS DATA--+ | | '-CLOB------------------------' +-K-+ +-FOR MIXED DATA-+ | | +-M-+ '-ccsid-clause---' | | '-G-' | | .-(--1--)-------. | +-+---GRAPHIC----+---------------+-------+--+--------------+--------------------------------+ | | '-(--integer--)-' | '-ccsid-clause-' | | +-+-GRAPHIC VARYING-+--(--integer--)---+ | | | '-VARGRAPHIC------' | | | | .-(--1M--)-------------. | | | '---DBCLOB----+----------------------+-' | | '-(--integer--+---+--)-' | | +-K-+ | | +-M-+ | | '-G-' | | .-(--1--)-------. | +-+-+-+-NATIONAL CHARACTER-+--+---------------+----------+---------------------+------------+ | | | +-NATIONAL CHAR------+ '-(--integer--)-' | | | | | | '-NCHAR--------------' | | | | | '-+-+-NATIONAL CHARACTER-+--VARYING-+--(--integer--)-' | | | | | +-NATIONAL CHAR------+ | | | | | | '-NCHAR--------------' | | | | | '-NVARCHAR------------------------' | | | | .-(--1M--)-------------. | | | '-----+-+-NATIONAL CHARACTER-+--LARGE OBJECT-+------+----------------------+-' | | | '-NCHAR--------------' | '-(--integer--+---+--)-' | | '-NCLOB--------------------------------' +-K-+ | | +-M-+ | | '-G-' | | .-(--1--)-------. | +-+-+-BINARY--+---------------+---------+-----------------+---------------------------------+ | | | '-(--integer--)-' | | | | | '-+-BINARY VARYING-+--(--integer--)-' | | | | '-VARBINARY------' | | | | .-(--1M--)-------------. | | | '---+-BLOB----------------+----+----------------------+-' | | '-BINARY LARGE OBJECT-' '-(--integer--+---+--)-' | | +-K-+ | | +-M-+ | | '-G-' | +-+-DATE-------------------------+----------------------------------------------------------+ | | .-(--0--)-. | | | +-TIME--+---------+------------+ | | | .-(--6--)-------. | | | '-TIMESTAMP--+---------------+-' | | '-(--integer--)-' | '---XML--+--------------+-------------------------------------------------------------------' '-ccsid-clause-' ccsid-clause |--CCSID--integer-----------------------------------------------|
説明
- OR REPLACE
- 現行サーバーにこの変数の定義が存在する場合に、その定義を置き換える、という動作を指定します。実際には、カタログで既存の定義を削除してから新しい定義に置き換える、という動作になりますが、例外として、この変数に対して与えられていた特権は影響を受けません。現行サーバーにこの変数の定義が存在しなければ、このオプションは無視されます。
- variable-name
- グローバル変数の名前を指定します。 暗黙的または明示的修飾子も含め、この名前で、現行サーバーに既に存在しているグローバル変数を識別することはできません。修飾された変数名を指定する場合、スキーマ名 は、QSYS2、QSYS、QTEMP、または SYSIBM にはできません。
SQL 名が指定されている場合、変数は、暗黙的または明示的修飾子で指定しているスキーマ内に作成されます。
システム名が指定されている場合、変数は、修飾子で指定しているスキーマ内に作成されます。修飾されない場合:
- CURRENT SCHEMA 特殊レジスターの値が *LIBL である場合、変数は、現行ライブラリー (*CURLIB) 内に作成されます。
- そうでない場合、変数は現行スキーマ内に作成されます。
- FOR SYSTEM NAME system-object-identifier
- グローバル変数のシステム・オブジェクト ID (system-object-identifier) を示します。
system-object-identifier は、現行サーバーに既に存在しているグローバル変数と同じものであってはなりません。
システム・オブジェクト ID は、非修飾システム
ID でなければなりません。
system-object-identifier が 指定される場合、variable-name は有効なシステム・オブジェクト名であってはなりません。
- data-type
- データ・タイプまたはグローバル変数を指定します。
- built-in-type
- 組み込みデータ・タイプを指定します。 それぞれの組み込みデータの詳細については、CREATE TABLEを参照してください。
- distinct-type-name
- 特殊タイプを指定します。グローバル変数の長さ、精度、位取りは、それぞれ特殊タイプの長さ、精度、位取りです。スキーマ名なしの特殊タイプを指定すると、その特殊 タイプ名は、SQL パス上のスキーマを検索することで解決されます。組み込みタイプに当てはまる制限は、特殊タイプのソース・タイプにも当てはまります。
- DEFAULT
- グローバル変数のデフォルト値を指定します。定数、特殊レジスター、グローバル変数、式、NULL キーワードを値として使用できます。明示的に値が指定されない場合、デフォルト値はその最初の参照時に決定されます。 デフォルト値が指定されていないと、変数は NULL 値に初期化されます。
- デフォルトの式で SQL データを変更したり外部アクションを実行したりすることはできません。式を指定する場合は、変数のデータ・タイプとの間に割り当ての互換性がある式でなければなりません。
- デフォルトの式で参照する表、ビュー、別名、特殊タイプ、シーケンス、グローバル変数、ユーザー定義関数はすべて、グローバル変数の作成時に現行サーバーに存在していなければなりません。 別名が参照している表やビューも、変数の作成時に存在していなければなりません。これには、ライブラリー QTEMP 内のオブジェクトも含まれます。QTEMP 内のオブジェクトはデフォルトの式で参照できますが、QTEMP 内のこれらのオブジェクトを除去しても、グローバル変数は除去されません。
注
セッション有効範囲: グローバル変数の有効範囲はセッションです。つまり、グローバル変数は、データベースでアクティブになっているすべてのセッションで使用できますが、その値は各セッションごとの専用の値になります。
グローバル変数の値の変更: グローバル変数の値の変更 は、トランザクション制御の対象ではありません。COMMIT ステートメントの場合でも ROLLBACK ステートメントの場合でも、グローバル変数の値は、トランザクションの終了時に保存されます。
グローバル変数を使用するための特権: このステートメントで作成するグローバル変数の読み取りや書き込みの操作を実行しようとする権限 ID には、そのグローバル変数に対する適切な特権が必要です。変数の定義者には暗黙的にその変数へのすべての特権が付与されます。
デフォルト値の設定: 作成したグローバル変数は、有効範囲内で初めて参照されたときに、デフォルト値でインスタンス化されます。ステートメントでグローバル変数を参照する場合は、そのステートメントの制御フローとは無関係にグローバル変数がインスタンス化されます。
新しく作成したセッション・グローバル変数の使用: 1 つのセッションでグローバル変数を作成した場合は、作業単位がコミットされるまで、他のセッションでそのグローバル変数を使用することはできません。ただし、作業単位のコミット前でも、その新しいグローバル変数を作成したセッションでは、その変数を使用できます。
1 つのセッションでグローバル変数をインスタンス化した後に、別のセッション (DROP や GRANT など) でそのグローバル変数が変更されても、既にインスタンス化した変数は影響を受けない場合があります。
グローバル変数の作成: グローバル変数は、*SRVPGM オブジェクトとして作成します。変数名が有効なシステム名でも、同じ名前の *SRVPGM が既に存在していれば、エラーが生成されます。変数名が有効なシステム名でない場合は、システム表名の生成に関する規則を使用して固有名が生成されます。名前の生成に関する規則については、表名の生成の規則を参照してください。
グローバル変数の定義は、関連したサービス・プログラム・オブジェクトに保管されます。*SRVPGM オブジェクトが保管された後、このシステムや別のシステム上に復元すると、カタログは定義を使用して自動的に更新されます。
- 同じシステム名の *SRVPGM オブジェクトが存在する場合は、その *SRVPGM が置き換えられます。
グローバル変数と SQL ルーチンの名前が同じ場合は、グローバル変数を最初に作成することによって、命名の競合を回避できます。
変数の所有権: 変数の所有者 は、そのステートメントを実行するスレッドのユーザー・プロファイルまたはグループ・ユーザー・プロファイルです。
変数の権限: SQL 名を使用する場合は、変数は、*PUBLIC に対するシステム権限 *EXCLUDE を使用して作成されます。システム名を使用する場合、変数は、スキーマの作成権限 (CRTAUT) パラメーターによって決められる *PUBLIC に対する権限を使用して作成されます。
変数の所有者がグループ・プロファイルのメンバー (GRPPRF キーワード) であり、グループ権限が指定されている (GRPAUT キーワード) 場合は、そのグループ・プロファイルにも、その変数に対する権限が与えられます。
変数のインスタンス化に関する権限: グローバル変数がインスタンス化されるときには、そのグローバル変数の所有者の権限に基づいて DEFAULT 文節が評価されます。
- 既存のコメントまたはラベルは破棄されます。
- 権限を持つユーザーは維持されます。オブジェクト所有者は変更される可能性があります。
- 現在のジャーナル監査は保持されます。
例
例 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))