Hitachi

ノンストップデータベース HiRDB Version 10 SQLリファレンス


4.21.1 EXECUTE IMMEDIATE文の形式と規則

〈この項の構成〉

(1) 機能

文字列で与えられたSQLを,前処理して実行します。

(2) 使用権限

なし。

(3) 形式

 EXECUTE IMMEDIATE{’文字列‘|:埋込み変数}
 〔{INTO :埋込み変数〔:標識変数〕
       〔,:埋込み変数〔:標識変数〕〕…
   |INTO DESCRIPTOR 〔:〕SQL記述領域名
                       〔CHARACTER_SET〔:〕文字集合名記述領域名〕}〕
 〔{USING :埋込み変数〔:標識変数〕
        〔,:埋込み変数〔:標識変数〕〕…
   |USING DESCRIPTOR 〔:〕SQL記述領域名
                       〔CHARACTER_SET〔:〕文字集合名記述領域名〕}〕

(4) オペランド

(a) {’文字列’|:埋込み変数}

文字列

実行するSQLの文字列を直接文字定数として指定します。

実行するSQLを文字定数として指定する場合で,SQL中に1個のアポストロフィを表すには,2個のアポストロフィを続けて指定してください。

埋込み変数

実行するSQLの文字列を埋込み変数で指定します。

埋込み変数を指定する場合は,前に:(コロン)を付けます。

(b) INTO:埋込み変数〔:標識変数〕〔,:埋込み変数〔:標識変数〕〕…

埋込み変数

1行SELECT文の検索結果を受け取る場合,又はCALL文に出力?パラメタが含まれる場合,その値を埋込み変数で受け取るときに,その検索結果の列の値,又は出力?パラメタの値を受け取る埋込み変数を指定します。

標識変数

埋込み変数に返される検索結果の列の値がナル値かどうかを示す値が返される標識変数を指定します。

標識変数は,SMALLINTのデータ型を持つ埋込み変数として,埋込みSQL宣言節で宣言してください。

標識変数を省略した場合は,ナル値を受け取れません。

(c) INTO DESCRIPTOR〔:〕SQL記述領域名〔CHARACTER_SET〔:〕文字集合名記述領域名〕

SQL記述領域名

1行SELECT文の検索結果,又はCALL文の出力?パラメタの値をSQL記述領域を用いて受け取るときに,その検索結果の列の値,又は出力?パラメタの値を受け取るための変数を記述した,SQL記述領域の名称を指定します。

文字集合名記述領域名

1行SELECT文の検索結果,又はCALL文の出力?パラメタの値をSQL記述領域を用いて受け取るときに,その検索結果の列の値,又は出力?パラメタの値を受け取るための変数の文字集合名を記述した,文字集合名記述領域の名称を指定します。

文字集合名記述領域については,マニュアル「HiRDB UAP開発ガイド」を参照してください。

(d) USING:埋込み変数〔:標識変数〕〔,:埋込み変数〔:標識変数〕〕…

埋込み変数

SQLに入力?パラメタが含まれる場合,その値を埋込み変数で与えるときに,その入力?パラメタに与える値を持つ埋込み変数を指定します。

USING句で指定する埋込み変数の数と,EXECUTE IMMEDIATE文で実行するSQLに含まれる入力?パラメタの数を同じにしてください。なお,埋込み変数と入力?パラメタは,それぞれ並びの順に先頭から対応付けられます。

USING句で指定する埋込み変数のデータ型は,対応する入力?パラメタに対して許されるデータ型にしてください。

標識変数

埋込み変数の値がナル値かどうかを示す標識変数を指定します。

標識変数は,SMALLINTのデータ型を持つ埋込み変数として,埋込みSQL宣言節で宣言してください。

標識変数を省略した場合は,埋込み変数の値はナル値以外と仮定されます。

(e) USING DESCRIPTOR〔:〕SQL記述領域名〔CHARACTER_SET〔:〕文字集合名記述領域名〕

SQL記述領域名

入力?パラメタの値をSQL記述領域を用いて与えるときに,その入力?パラメタの値を与えるための変数を記述した,SQL記述領域の名称を指定します。

文字集合名記述領域名

入力?パラメタの値をSQL記述領域を用いて与えるときに,その入力?パラメタの値を与えるための変数の文字集合名を記述した,文字集合名記述領域の名称を指定します。

文字集合名記述領域については,マニュアル「HiRDB UAP開発ガイド」を参照してください。

(5) 共通規則

  1. 実行するSQL文字列中に,SQL先頭子,及びSQL終了子は指定できません。

  2. 実行するSQLの最大長は,2,000,000バイトです。ただし,SQLの文字列を文字定数で指定した場合は,UAP記述言語の文字定数の最大長です。

  3. 埋込み変数の型は,次に示す構造体です。

      struct {
            long  xxxxxxx;      /* SQL文の有効長   */
            char  yyyyyyy[n];   /* SQL文格納エリア */
      } zzzzzzz;
    (凡例)

    xxxxxxxは,文字配列yyyyyyy中に格納した文字列の有効長を示します。

    1 ≦ (xxxxxxxの値) ≦ 2000000

    なお,文字列の有効長に文字列の終わりを示す‘¥0’は含みません。

    nは,任意です。

  4. INTO句で指定する埋込み変数の数と,検索結果の列の数を同じにしてください。実行するSQLが1行SELECT文の場合,埋込み変数の数と,列の数が同じでないときは,SQL連絡領域のSQLWARN3領域に警告フラグ”W”が設定されます。なお,埋込み変数と検索結果の列,又は埋込み変数と出力?パラメタは,それぞれ並びの順に先頭から対応付けられます。

  5. INTO句で指定する埋込み変数のデータ型は,対応する列,出力パラメタのデータ型,又は変換できるデータ型にしてください。

  6. INTO句で指定する固定長文字列(各国文字列,及び混在文字列を含む)の埋込み変数に取り出すデータが,その埋込み変数の定義長より短い場合は,左詰めに挿入され,余りの部分に空白が設定されます。

  7. 検索結果の列の値又はCALL文の出力?パラメタの値がナル値の場合,対応する埋込み変数の値は保証しません。

  8. INTO句に指定した埋込み変数が既定文字集合の文字データ型でかつ,検索結果の列又はCALL文の出力?パラメタの文字集合が異なる文字データ型の場合,自動的に埋込み変数の文字集合に変換します。

  9. USING句に指定した埋込み変数が既定文字集合の文字データ型で,かつ入力?パラメタの文字集合と異なる場合,自動的に入力?パラメタの文字集合に変換します。

(6) 留意事項

  1. EXECUTE IMMEDIATE文は,次に示すSQLを実行する場合と同じです。文字列で指定したSQLを繰り返して実行する場合は,一度PREPARE文で前処理して,EXECUTE文で繰り返し実行することをお勧めします。

    • PREPARE SQL文識別子FROM{’文字列‘|:埋込み変数}

    • EXECUTE SQL文識別子

    EXECUTE IMMEDIATE文で前処理・実行できるSQLを次に示します。

    • 操作系SQL

      ASSIGN LIST文,CALL文,DELETE文,準備可能動的DELETE文:位置付け,DROP LIST文,INSERT文,PURGE TABLE文,1行SELECT文,UPDATE文,準備可能動的UPDATE文:位置付け

    • 制御系SQL

      LOCK TABLE文

    • 定義系SQL

      ALTER INDEX,ALTER PROCEDURE,ALTER ROUTINE,ALTER TABLE,ALTER TRIGGER,COMMENT,CREATE AUDIT,CREATE CONNECTION SECURITY,CREATE FUNCTION,CREATE INDEX,CREATE PROCEDURE,CREATE SCHEMA,CREATE SEQUENCE,CREATE TABLE,CREATE TRIGGER,CREATE TYPE,CREATE VIEW,DROP AUDIT,DROP CONNECTION SECURITY,DROP DATA TYPE,DROP FUNCTION,DROP INDEX,DROP PROCEDURE,DROP SCHEMA,DROP SEQUENCE,DROP TABLE,DROP TRIGGER,DROP VIEW,GRANT,REVOKE

(7) 使用例

  1. 文字列として与えたSQL’PURGE TABLE ZAIKO’を前処理して実行します。

    EXECUTE IMMEDIATE ‘PURGE TABLE ZAIKO’
  2. 埋込み変数(:ZAIX)として定義したSQLを前処理して実行します。

    EXECUTE IMMEDIATE :ZAIX
  3. 文字列として与えたSQL’SELECT SNAME FROM ZAIKO WHERE SCODE = ?’を前処理して実行し,検索結果を埋込み変数(:XSNAME),標識変数(:ISNAME)に読み込みます。このとき,?パラメタに与える値の情報を格納した埋込み変数(:XSCODE),標識変数(:ISCODE)を指定します。

    EXECUTE IMMEDIATE ’SELECT SNAME FROM ZAIKO WHERE SCODE = ?’ 
          INTO :XSNAME:ISNAME
          USING :XSCODE:ISCODE