Hitachi

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


4.31.1 PREPARE文の形式と規則

〈この項の構成〉

(1) 機能

文字列で与えられたSQLを実行するための前処理をして,そのSQLにSQL文識別子,又は拡張文名を付けます。また,OUTPUT,INPUTを指定することで,DESCRIBE〔OUTPUT〕文,DESCRIBE INPUT文で得られる検索情報,入出力情報を取得することもできます。

(2) 使用権限

なし。

(3) 形式

 PREPARE {SQL文識別子|拡張文名}FROM{’文字列‘|:埋込み変数}
             〔WITH {SQLNAME|〔ALL〕TYPE}
             〔,{SQLNAME|〔ALL〕TYPE}〕OPTION〕
             〔OUTPUT〔:〕SQL記述領域名〔〔:〕列名記述領域名〕
                            〔TYPE〔:〕型名記述領域名〕〕
                                     〔CHARACTER_SET 〔:〕文字集合名記述領域名〕〕
             〔INPUT  〔:〕SQL記述領域名〔〔:〕列名記述領域名〕
                                      〔CHARACTER_SET 〔:〕文字集合名記述領域名〕〕

(4) オペランド

(a) {SQL文識別子|拡張文名}

SQL文識別子

前処理するSQLを識別するためにSQL文に付けた名称を指定します。

SQL文識別子については,「名前の指定」を参照してください。

HiRDBの予約語も使用できますが,使用する場合,予約語と同じ名称でも引用符(”)で囲まないでください。ただし,’SELECT’,及び’WITH’は使用できません。

拡張文名

ALLOCATE CURSOR文でカーソルを割り当てる場合に,前処理するSQLを識別するためにSQL文に付けた拡張文名を指定します。

拡張文名については,「拡張文名」を参照してください。

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

文字列

前処理するSQLの文字列を直接文字定数として指定します。

前処理する文字列中に,SQL先頭子,及びSQL終了子は指定できません。

前処理するSQLを文字定数として指定する場合で,SQL中に1個のアポストロフィを表すには,2個のアポストロフィを続けて指定します。

前処理するSQLの文字列の最大長は,2,000,000バイトです。ただし,埋込み型で,前処理するSQLを直接文字定数で指定した場合は,ホスト言語の文字定数の最大長です。

埋込み変数

可変長文字型の埋込み変数を指定します。

既定文字集合以外の文字集合は指定できません。

(c) 〔WITH {SQLNAME|〔ALL〕TYPE}〔,{SQLNAME|〔ALL〕TYPE}〕OPTION〕

SQLNAME

DESCRIBE文,DESCRIBE TYPE文で列名記述領域名を指定して,検索項目の列名情報,ユーザ定義型の属性名を受け取る場合に指定します。OUTPUT又はINPUT句で,列名記述領域名を指定した場合は,SQLNAMEを省略できます。

〔ALL〕TYPE

DESCRIBE文で型名記述領域を指定して,検索項目の型名情報を受け取る場合に指定します。OUTPUT句で型名記述領域名を指定した場合は,TYPEを省略できます。ALL TYPEは,DESCRIBE TYPE文でユーザ定義型の定義情報を受け取る場合に指定します。OUTPUT句で型名記述領域名を指定しても,ALL TYPEは省略できません。

(d) 〔OUTPUT〔:〕SQL記述領域名〔〔:〕列名記述領域名〕〔TYPE〔:〕型名記述領域名〕〕〔CHARACTER_SET 〔:〕文字集合名記述領域名〕〕

SQL記述領域名

SQLの検索項目情報(前処理したSQLがSELECT文の場合),又は出力?パラメタ情報(前処理したSQLがCALL文の場合)を受け取るSQL記述領域の名称を指定します。

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

列名記述領域名

検索項目の名称,又はルーチンのパラメタ名を受け取る列名記述領域を指定します。

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

型名記述領域名

検索項目のユーザ定義型名を受け取る型名記述領域を指定します。

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

文字集合名記述領域名

検索項目情報(前処理したSQLがSELECT文の場合),又は出力?パラメタ情報(前処理したSQLがCALL文の場合)の文字集合名を受け取る文字集合名記述領域を指定します。

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

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

SQL記述領域名

入力?パラメタ情報を受け取るSQL記述領域の名称を指定します。

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

列名記述領域名

検索項目の名称,又はルーチンのパラメタ名を受け取る列名記述領域を指定します。

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

文字集合名記述領域名

入力?パラメタ情報の文字集合名を受け取る文字集合名記述領域を指定します。

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

(5) 共通規則

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

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

    (凡例)

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

    1 ≦ (xxxxxxxの値) ≦ 2000000

    なお,文字列の有効長に文字列の終わりを示す0(ゼロ)は含みません。

    nは,任意です。

  2. SQLNAMEは重複して指定できません。また,〔ALL〕TYPEも重複して指定できません。

  3. UAPは,PREPARE文を実行する前に,SQL記述領域にSQLVARの数(SQLN領域)を設定してください。

  4. SQLDATAとSQLINDはDESCRIBE文実行時,又はINPUT,OUTPUTを指定したPREPARE文実行時にクリアされるので,DESCRIBE文を使用する,又はINPUT,OUTPUTを指定してPREPARE文を使用する場合は,その実行後に値を設定してください。

  5. 列名記述領域名は,検索項目の名称,又はルーチンのパラメタ名を受け取る場合だけ指定してください。ただし,ルーチンのパラメタ名は,CALL文の引数に単独で?パラメタを指定した場合にだけ受け取ることができます。?パラメタを含む値式を指定した場合は,列名記述領域の名称の長さが0になります。

  6. 型名記述領域名は,検索項目のユーザ定義型名を受け取る場合だけ指定してください。

  7. 文字集合名記述領域名は,文字集合名を受け取る場合だけ指定してください。

(6) 留意事項

  1. 前処理した結果は,そのトランザクション内だけで有効です。したがって,前処理したSQLに対するDESCRIBE文,EXECUTE文,OPEN文,FETCH文及びCLOSE文は同じトランザクション内で実行してください。ただし,前処理したSQLがホールダブルカーソルの場合は次のようになります。

    • 該当するトランザクションで前処理し,コミットした場合

      前処理した結果は,DISCONNECT文を実行するまで有効です。

    • 該当するトランザクションで前処理し,ロールバックした場合

      該当するトランザクション内でだけ有効です。

  2. PREPARE文で前処理できるSQLは,PREPARE文で前処理しておく必要があります。PREPARE文で前処理できるSQLを次に示します。

    • 操作系SQL

      ASSIGN LIST文(EXECUTE文で実行します)

      CALL文(EXECUTE文で実行します)

      DELETE文(EXECUTE文で実行します)

      準備可能動的DELETE文:位置付け(EXECUTE文で実行します)

      DROP LIST文(EXECUTE文で実行します)

      INSERT文(EXECUTE文で実行します)

      PURGE TABLE文(EXECUTE文で実行します)

      1行SELECT文(EXECUTE文で実行します)

      動的SELECT文(OPEN文,FETCH文,及びCLOSE文で実行します)

      UPDATE文(EXECUTE文で実行します)

      準備可能動的UPDATE文:位置付け(EXECUTE文で実行します)

      代入文(EXECUTE文で実行します)

    • 制御系SQL

      LOCK TABLE文(EXECUTE文で実行します)

      SET SESSION AUTHORIZATION文(EXECUTE文で実行します)

    • 定義系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

      (定義系SQLは,すべてEXECUTE文で実行します)

  3. SQL文識別子は,埋込み変数名と同様に,コンパイル単位のモジュール内で有効な名前であり,同じSQL文識別子に対する複数のSQLを,複数のモジュールにわたって使用できません。

  4. PREPARE文で前処理した動的SELECT文の実行中(OPEN文を実行してからCLOSE文を実行するまでの間)に,その動的SELECT文のFROM句に指定した表を別のSQL文で更新しないでください。

  5. 指定したSQL文識別子,又は拡張文名が既にほかのSQL文を識別している場合は,暗黙的にDEALLOCATE PREPARE文が実行され,前に識別していたSQL文は無効になります。その後,指定したSQL文識別子,又は拡張文名はこのPREPARE文で前処理したSQL文を識別します。ただし,暗黙的に実行されたDEALLOCATE PREPARE文でエラーが発生した場合は,前に識別していたSQL文を識別したままとなります。

  6. PREPARE文でOUTPUTを指定した場合,DESCRIBE〔OUTPUT〕を実行した場合と同様に扱われます。また,PREPARE文でINPUTを指定した場合,DESCRIBE〔INPUT〕を実行した場合と同様に扱われます。OUTPUT,INPUTについては,「DESCRIBE文 形式1(検索情報,入出力情報の受け取り)」及び「DESCRIBE文 形式2(検索情報,入出力情報の受け取り)」を参照してください。

  7. ユーザ定義型の所有者名の長さが9文字以上の場合,型名記述領域を使用できません。

(7) 使用例

  1. 文字列で与えられたSQL’SELECT * FROM ZAIKO’を実行するために前処理します。前処理後のSQL文字列に付けるSQL識別子の名称は,’PRESQL’とします。

    PREPARE PRESQL FROM
        ‘SELECT * FROM ZAIKO’
  2. 埋込み変数(XSQL)中に指定したSQL文字列を前処理します。前処理後のSQL文字列に付けるSQL識別子の名称は,’PRESQL’とします。

    PREPARE PRESQL FROM :XSQL