SQLの実行 (RUNSQL)

SQL実行(RUNSQL)コマンドは,SQL (SQL)パラメーターに指定された構造化照会言語(SQL)ステートメントを実行します。

SQLステートメントは,コマンドの実行時に解析されます。コマンドが実行されるまで構文エラーは識別されません。

RUNSQLは呼び出し元の活動化グループ内でSQLステートメントを実行します。RUNSQLがコンパイル済みCLプログラムまたはILE CLプロシージャーで実行される場合,そのプログラムまたはプロシージャーの活動化グループが使用されます。

制約事項:

パラメーター

キーワード 記述 選択項目 ノーツ
SQL SQL 文字値 必須, 定位置 1
COMMIT コミットメント制御 *CHG, *UR, *CS, *ALL, *RS, *NONE, *NC, *RR オプショナル, 定位置 2
NAMING 命名 *SYS, *SQL オプショナル, 定位置 3
DATFMT 日付形式 *JOB, *USA, *ISO, *EUR, *JIS, *MDY, *DMY, *YMD, *JUL オプショナル
DATSEP 日付区切り文字 *JOB, '/', '.', ',', '-', ' ', *BLANK オプショナル
TIMFMT 時刻形式 *HMS, *USA, *ISO, *EUR, *JIS オプショナル
TIMSEP 時刻区切り文字 *JOB, ':', '.', ',', ' ', *BLANK オプショナル
DFTRDBCOL 省略時のコレクション 名前, *NONE オプショナル
DECMPT 小数点 *JOB, *SYSVAL, *PERIOD, *COMMA オプショナル
SRTSEQ ソート順序 単一値: *JOB, *LANGIDUNQ, *LANGIDSHR, *HEX
その他の値: 修飾オブジェクト名
オプショナル
修飾子 1: ソート順序 名前
修飾子 2: ライブラリー 名前, *LIBL, *CURLIB
LANGID 言語ID 文字値, *JOB オプショナル
OPTION ソース・リスト・オプション *NOLIST, *LIST オプショナル
PRTFILE 印刷ファイル 修飾オブジェクト名 オプショナル
修飾子 1: 印刷ファイル 名前, QSYSPRT
修飾子 2: ライブラリー 名前, *LIBL, *CURLIB
SECLVLTXT 第2レベル・テキスト *NO, *YES オプショナル
ALWCPYDTA データのコピー可能 *OPTIMIZE, *YES, *NO オプショナル
ALWBLK ブロック化可能 *ALLREAD, *NONE, *READ オプショナル
SQLCURRULE SQL規則 *DB2, *STD オプショナル
DECRESULT 10進数結果オプション 要素リスト オプショナル
要素 1: 最大精度 31, 63
要素 2: 最大位取り 0-63, 31
要素 3: 割り算の最小位取り 0-9, 0
CONACC 同時アクセス解決 *DFT, *CURCMT, *WAIT オプショナル
SYSTIME システム時刻に依存 *YES, *NO オプショナル

SQL (SQL)

実行する単一の構造化照会言語(SQL)ステートメントを指定します。

これは必須パラメーターです。

文字値
実行するSQLステートメントを指定してください。最大ステートメント長は5000バイトです。

コミットメント制御 (COMMIT)

SQLステートメントをコミットメント制御のもとで実行するかどうかを指定します。

*CHG または *UR
SQL ALTER, CALL, COMMENT ON, CREATE, DROP, GRANT, LABEL ON, RENAME,およびREVOKEステートメントで参照されるオブジェクト,および更新,削除,および挿入される行は作業単位(トランザクション)の終わりまでロックされることを指定します。他のジョブのコミットされていない変更を見ることができます。
*CS
SQL ALTER, CALL, COMMENT ON, CREATE, DROP, GRANT, LABEL ON, RENAME,およびREVOKEステートメントで参照されるオブジェクト,および更新,削除,および挿入される行は作業単位(トランザクション)の終わりまでロックされることを指定します。選択されたのに更新されていない行は,次の行が選択されるまでロックされます。他のジョブのコミットされていない変更を見ることはできません。
*ALL または *RS
SQL ALTER, CALL, COMMENT ON, CREATE, DROP, GRANT, LABEL ON, RENAME,およびREVOKEステートメントで参照されるオブジェクトおよび選択,更新,削除,および挿入される行は作業単位(トランザクション)の終わりまでロックされることを指定します。他のジョブのコミットされていない変更を見ることはできません。
*NONE または *NC
コミットメント制御が使用されないことを指定します。他のジョブのコミットされていない変更を見ることができます。SQL DROP SCHEMAステートメントがプログラムに組み込まれている場合には,*NONEまたは*NCを使用しなければなりません。
*RR
SQL ALTER, CALL, COMMENT ON, CREATE, DROP, GRANT, LABEL ON, RENAME,およびREVOKEステートメントで参照されるオブジェクトおよび選択,更新,削除,および挿入される行は作業単位(トランザクション)の終わりまでロックされることを指定します。他のジョブのコミットされていない変更を見ることはできません。SELECT, UPDATE, DELETE,およびINSERTの各ステートメントで参照されたすべてのテーブルは,作業単位(トランザクション)の終わりまで排他的にロックされます。

命名規則 (NAMING)

SQLステートメント中のオブジェクトに使用する命名規則を指定します。

*SYS
システムの命名規則(ライブラリー名/ファイル名)が使用されます。
*SQL
SQLの命名規則(スキーマ名.テーブル名)が使用されます。

日付形式 (DATFMT)

日付結果のカラムにアクセスする時に使用する形式を指定します。入力日付ストリングの場合には,指定した値は,日付が正しい形式で指定されているかどうかを判別するために使用されます。

注: 形式*USA, *ISO, *EUR,または*JISを使用する入力日付ストリングは常に有効です。

*JOB
ジョブに指定された形式が使用されます。ジョブの現行日付形式を判別するには,ジョブ表示(DSPJOB)コマンドを使用してください。
*USA
米国日付形式MM/DD/YYYYが使用されます。
*ISO
国際標準化機構(ISO)日付形式YYYY-MM-DDが使用されます。
*EUR
欧州日付形式DD.MM.YYYYが使用されます。
*JIS
日本工業規格(JIS)日付形式YYYY-MM-DDが使用されます。
*MDY
日付形式MM/DD/YYが使用されます。
*DMY
日付形式DD/MM/YYが使用されます。
*YMD
日付形式YY/MM/DDが使用されます。
*JUL
年間通算日形式YY/DDDが使用されます。

日付区切り文字 (DATSEP)

日付の結果のカラムをアクセスする時に使用する区切り記号を指定します。

注: このパラメーターが適用されるのは,*JOB, *MDY, *DMY, *YMD,または*JULが日付形式 (DATFMT)パラメーターに指定されている場合だけです。

*JOB
プリコンパイル時,新規対話式SQLセッションの作成時,あるいはRUNSQLSTMの実行時にジョブのために指定される日付区切り文字が使用されます。

ジョブの現行日付区切り文字を判別するには,ジョブ表示(DSPJOB)コマンドを使用してください。

'/'
スラッシュが日付区切り文字として使用されます。
'.'
ピリオドが日付区切り文字として使用されます。
'-'
ダッシュが日付区切り文字として使用されます。
','
コンマが日付区切り文字として使用されます。
' ' または *BLANK
ブランク( )が日付区切り文字として使用されます。

時刻形式 (TIMFMT)

時刻結果カラムにアクセスする時に使用する形式を指定します。入力時刻ストリングの場合には,指定した値は,時刻が正しい形式で指定されているかどうかを判別するために使用されます。

注: 形式*USA, *ISO, *EUR,または*JISを使用する入力時刻ストリングは常に有効です。

*HMS
HH:MM:SS形式が使用されます。
*USA
米国時刻形式HH:MMXXが使用されます。ここで,XXはAMまたはPMです。
*ISO
国際標準化機構(ISO)時刻形式HH.MM.SSが使用されます。
*EUR
欧州時刻形式HH.MM.SSが使用されます。
*JIS
日本工業規格(JIS)時刻形式HH:MM:SSが使用されます。

時刻区切り文字 (TIMSEP)

時刻の結果のカラムをアクセスする時に使用される区切り記号を指定します。

注: このパラメーターが適用されるのは,*HMSが時刻形式 (TIMFMT)パラメーターに指定されている場合だけです。

*JOB
プリコンパイル時,新規対話式SQLセッションの作成時,あるいはRUNSQLSTMの実行時にジョブのために指定される時刻区切り文字が使用されます。

ジョブの現行時刻区切り文字を判別するには,ジョブ表示(DSPJOB)コマンドを使用してください。

':'
コロンが時刻区切り文字として使用されます。
'.'
ピリオドが時刻区切り文字として使用されます。
','
コンマが時刻区切り文字として使用されます。
' ' または *BLANK
ブランク( )が時刻区切り文字として使用されます。

省略時のコレクション (DFTRDBCOL)

テーブル,ビュー,索引,SQLパッケージ,別名,制約,外部プログラム,ノード・グループ,およびトリガーの修飾されていない名前に使用されるスキーマIDの名前を指定します。このパラメーターが適用されるのは,静的SQLステートメントに対してだけです。

*NONE
命名規則 (NAMING)パラメーターに指定された命名規則が使用されます。
名前
NAMINGパラメーターに指定された命名規則の代わりに使用するスキーマIDの名前を指定します。

小数点 (DECMPT)

SQLステートメント中の数値定数に使用する小数点値を指定します。この値は,文字と数値の間のキャスト時に小数点文字としても使用されます。

*JOB
小数点の表記は,ステートメントを実行しているジョブが使用している値になります。
*SYSVAL
QDECFMTシステム値が小数点として使用されます。
*PERIOD
ピリオドが小数点を表します。
*COMMA
コンマが小数点を表します。

ソート順序 (SRTSEQ)

SQLステートメント中のストリング比較に使用する分類順序テーブルを指定します。

単一値

*JOB
ジョブのSRTSEQ値が使用されます。
*LANGIDUNQ
言語ID (LANGID)パラメーターに指定された言語の固有の重み付け分類テーブルが使用されます。
*LANGIDSHR
LANGIDパラメーターに指定された言語の共用重み付け分類テーブルが使用されます。
*HEX
分類順序テーブルは使用されません。分類順序の決定には,その文字の16進数値が使用されます。

修飾子1: ソート順序

名前
このプログラムで使用する分類順序テーブルの名前を指定します。

修飾子2: ライブラリー

*LIBL
最初に一致するものが見つかるまで,現行スレッドのライブラリー・リスト内のすべてのライブラリーが検索されます。
*CURLIB
ジョブの現行ライブラリーが検索されます。ジョブの現行ライブラリーとして指定されているライブラリーがない場合は,QGPLライブラリーが使用されます。
名前
検索するライブラリーの名前を指定してください。

言語ID (LANGID)

SRTSEQ(*LANGIDUNQ)またはSRTSEQ(*LANGIDSHR)が指定されている時に使用される言語IDを指定します。

*JOB
ジョブのLANGID値が検索されます。
言語ID
言語IDを指定してください。

ソース・リスト・オプション (OPTION)

このコマンドによってリストが生成されるかどうかを指定します。

*NOLIST
リストは生成されません。メッセージはジョブ・ログに送られます。
*LIST
リストが生成されます。

印刷ファイル (PRTFILE)

コマンドからの印刷出力の送り先の印刷装置ファイルを指定します。このファイルには,132バイトの最小長が必要です。レコード長が132バイトより小さいファイルを指定すると,情報は失われます。

修飾子1: 印刷ファイル

QSYSPRT
出力ファイルはIBM提供の印刷装置ファイルQSYSPRTに送られます。
名前
出力の送り先の印刷装置ファイルの名前を指定してください。

修飾子2: ライブラリー

*LIBL
最初に一致するものが見つかるまで,現行スレッドのライブラリー・リスト内のすべてのライブラリーが検索されます。
*CURLIB
ジョブの現行ライブラリーが検索されます。ジョブの現行ライブラリーとして指定されているライブラリーがない場合は,QGPLライブラリーが使用されます。
名前
印刷装置ファイルが入っているライブラリーの名前を指定してください。

第2レベル・テキスト (SECLVLTXT)

第2レベル・メッセージ・テキスト記述を出力リストに書き込むかどうかを指定します。

*NO
第2レベル・テキストがリストに組み込まれません。
*YES
置換データがある第2レベル・テキストが,すべてのメッセージのリストに追加されます。

データのコピー可能 (ALWCPYDTA)

データのコピーをSELECTステートメント中で使用できるかどうかを指定します。

*OPTIMIZE
システムは,データベースから直接検索されたデータを使用するか,あるいはデータのコピーを使用するかを判別します。この判断は,どの方式で最善のパフォーマンスが得られるかに基づいて行われます。コミットメント制御 (COMMIT)パラメーターが*NONEでない場合には,最良のパフォーマンスのために,可能な場合はブロック化可能(ALWBLK)パラメーターを*ALLREADに設定する必要があります。
*YES
データのコピーが使用されるのは,必要な場合だけです。
*NO
データのコピーを使用しません。QUERYを実行するためにデータの一時コピーが必要な場合には,エラー・メッセージが戻されます。

ブロック化可能 (ALWBLK)

データベース管理機能がレコード・ブロック化およびブロック化を読み取り専用カーソルに使用できるエクステントを使用できるかどうかを指定します。

*ALLREAD
読み取り専用カーソルのために行がブロック化されます。明示的に変更できない,プログラム中のすべてのカーソルは,プログラム中にEXECUTEまたはEXECUTE IMMEDIATEステートメントがあっても読み取り専用処理用にオープンされます。

*ALLREADを指定すると,次の通りです。

  • すべての読み取り専用カーソルのためにレコードのブロック化が可能になります。
  • プログラム中のほとんどすべての読み取り専用カーソルのパフォーマンスを向上できますが,QUERYは次の方法で制限されます。
    • *ALLREADが指定されていると,ロールバック(ROLLBACK)コマンド,ホスト言語のROLLBACKステートメント,またはROLLBACK HOLD SQLステートメントは読み取り専用カーソルを位置変更しません。
    • 位置決めしたUPDATEまたはDELETEステートメントの動的実行(例えば,EXECUTE IMMEDIATEの使用)は,カーソルのDECLAREステートメントにFOR UPDATE文節が含まれていない限り,カーソル内の行を更新するためには使用できません。
*NONE
行は,カーソルのデータの検索のためにブロック化されません。

*NONEを指定すると,次の通りです。

  • 検索されるデータが最新であることを保証します。
  • 照会のためのデータの最初の行を検索するために必要な時間が削減される場合があります。
  • データベース管理機能が,QUERYがクローズされる前にQUERYの最初の数行しか検索されないと,プログラムによって使用されないデータ行のブロックの検索を停止します。
  • 大量の行数を検索するQUERYのパフォーマンス全体が低下する可能性があります。
*READ
次の場合には,レコードはカーソルのデータの読み取り専用検索のためにブロック化されません。
  • コミットメント制御は使用されないことを指示する*NONEがコミットメント制御 (COMMIT)パラメーターに指定されます。
  • カーソルがFOR READ ONLY文節を指定して宣言されているか,あるいはカーソルのために位置したUPDATEまたはDELETEステートメントを実行できなかった動的ステートメントがない場合。

SQL規則 (SQLCURRULE)

SQLステートメントに使用される意味体系を指定します。

*DB2
すべてのSQLステートメントの意味体系は,省略時の値により,DB2について確立された規則となります。このオプションでは,次の意味体系が制御されます。

16進定数は文字データとして取り扱われます。

*STD
すべてのSQLステートメントの意味体系は,省略時の値により,ISOおよびANSI SQL規格によって確立された規則となります。このオプションでは,次の意味体系が制御されます。

16進定数は2進データとして取り扱われます。

10進数結果オプション (DECRESULT)

10進数演算機構などの10進演算時に使用される必要がある最大精度,最大位取り,および最小除算位取りを指定します。指定した制限はNUMERICおよびDECIMALデータ・タイプにのみ適用されます。

要素1: 最大精度

31
10進演算から戻される必要がある最大精度(長さ)は31桁です。
63
10進演算から戻される必要がある最大精度(長さ)は63桁です。

要素2: 最大位取り

31
10進演算から戻される必要がある最大位取り(小数点の右側の小数部の桁数)は31桁です。
0から63
10進演算から戻される必要がある最大位取り(小数点の右側の小数部の桁数)を指定します。この値は0から最大精度までとすることができます。

要素3: 割り算の最小位取り

0
最小除算位取りは使用されません。
0から9
10進演算から戻される必要がある最小除算位取り(小数点の右側の小数部の桁数)を指定します。この値は最大位取りを超えることができません。最大位取りとして0が指定された場合には,最小除算位取りは使用されません。

同時アクセス解決 (CONACC)

データベース・マネージャーが,データの更新処理中にレコード・ロックの競合をどのように処理するかを指定します。

*DFT
このプログラムに並行アクセス・オプションを明示的に設定しないことを指定します。プログラムが呼び出されたときに,有効な値が使用されます。値は,QUERYオプション・ファイル内のSQL_CONCURRENT_ACCESS_RESOLUTIONオプションを使用して設定できます。
*CURCMT
読み取り専用QUERYでのレコード・ロック競合の場合,可能であれば,現在コミット中のデータを使用するようにデータベース・マネージャーに指示します。これは,コミット・レベルが*CSの場合にのみ適用されます。
*WAIT
レコード・ロック競合の場合に,結果を待つようデータベース・マネージャーに指示します。

システム時刻に依存 (SYSTIME)

静的SQLステートメントと動的SQLステートメントの両方でのシステム期間一時表への参照がCURRENT TEMPORAL SYSTEM_TIME特殊レジスターの値の影響を受けるかどうかを指定します。

*YES
システム期間一時表への参照はCURRENT TEMPORAL SYSTEM_TIME特殊レジスターの値の影響を受けます。
*NO
システム期間一時表への参照はCURRENT TEMPORAL SYSTEM_TIME特殊レジスターの値の影響を受けません。

1:テーブルへの行の挿入

RUNSQL   SQL('INSERT INTO TESTLIB/T1 VALUES (1)')

このコマンドは,ライブラリーTESTLIBのファイルT1に1行挿入します。

2: QUERYの実行,および一時テーブルでの結果の保管

RUNSQL   SQL('CREATE TABLE QTEMP.T1 AS
              (SELECT * FROM QSYS2.SYSTABLES
               WHERE TABLE_SCHEMA = ''TESTLIB'') WITH DATA')
         COMMIT(*NONE) NAMING(*SQL)

このコマンドは,QUERYを実行し,結果を一時テーブルに保管します。このテーブルは,ライブラリーQTEMP内のファイルT1となります。このコマンドがCLプログラムまたはプロシージャーで実行される場合は,ファイル受信(RCVF)コマンドを使用してQUERYの結果を確認することができます。

3: SQLステートメントに式を使用

RUNSQL1: PGM  PARM(&LIB)
          DCL  &LIB TYPE(*CHAR) LEN(10)
          DCL  &SQLSTMT TYPE(*CHAR) LEN(1000)
          CHGVAR  VAR(&SQLSTMT) +
                  VALUE('DECLARE GLOBAL TEMPORARY TABLE RESULT +
                       AS (SELECT * FROM QSYS2.SYSTABLES WHERE +
                       TABLE_SCHEMA = ''' || &LIB || ''') WITH +
                       DATA WITH REPLACE NOT LOGGED')
          RUNSQL  SQL(&SQLSTMT) COMMIT(*NONE) NAMING(*SQL)
ENDSQL1: ENDPGM

この例では,RUNSQLコマンドをCLプログラムまたはプロシージャーで使用できる方法を示します。このSQLパラメーターは,リテラル・テキストをCL文字変数&LIBの値と連結するCL文字式として作成されます。

エラー・メッセージ

*ESCAPE メッセージ

SQLXXXX
4桁のSQL障害(SQL0204など)。
SQ2XXXX
20000から29999までのSQL障害(SQ20180など)。
SQ3XXXX
30000から39999までのSQL障害(SQ30106など)。