PREPARE

動的 SQL 文を処理します。

構文:

>>--EXEC SQL---PREPARE---stmt_name---.-------------.----->
                                     +-INTO :sqlda-+

 >---FROM---:hvar---END-EXEC-----><

パラメーター:

stmt_name 準備済みの文の名前。これは、後続の EXECUTE 文か OPEN 文、または前の DECLARE CURSOR 文 (あるいはその両方) で使用できます。
:sqlda データの取り込み先の出力 SQL 記述子領域 (SQLDA) データ構造。コロンを使用すると、他の埋め込み SQL 実装との互換性を確保できます。
:hvar SQL 文を含むホスト変数。

説明:

次の 2 つの方法のいずれかで準備された文を使用できます。

  • 準備済みの文を参照するカーソルを開きます。
  • 準備済みの文を実行します。

EXECUTE 文で準備済みの文を使用する場合は、結果を返す SQL 文を :hvar に含めることはできません。

シングルトンの SELECT 文 (SELECT INTO) は動的 SQL 文で使用できないため、この SELECT 文は準備できません。

PREPARE 文を使用する場合は、:hvar にある SQL 文にホスト変数または注釈を含めることができませんが、パラメーター マーカーを含めることはできます。また、SQL 文には、埋め込み SQL に対して排他的な SQL キーワードは含められません。

INTO :sqlda オプションは、DESCRIBE と PREPARE の機能をまとめたものです。そのため、次のサンプル コードは、

 EXEC SQL 
     PREPARE stmt1 INTO :sqlda FROM :stmt-buf
 END-EXEC

次のコードと同等です。

 EXEC SQL
     PREPARE stmt1 FROM :stmt-buf 
 END-EXEC
 EXEC SQL
     DESCRIBE stmt1 INTO :sqlda 
 END-EXEC

PREPARE 文の使用の詳細については、『データベース アクセス ガイド』を参照してください。

例:

 PROGRAM-ID. progname.
     
 WORKING-STORAGE SECTION.
 EXEC SQL INCLUDE SQLCA END-EXEC
 EXEC SQL BEGIN DECLARE SECTION END-EXEC
 01 prep           PIC X(80).
 01 nme            PIC X(20).
 01 car            PIC X(20).
 01 n60            PIC x(5).
 EXEC SQL END DECLARE SECTION END-EXEC.

 PROCEDURE DIVISION.
     EXEC SQL CONNECT TO 'srv1' USER 'sa' END-EXEC
     IF SQLCODE NOT = ZERO
        DISPLAY 'Error: Could not connect to database.'
        DISPLAY SQLERRMC
        DISPLAY SQLERRMC
        STOP RUN
     END-IF

* Ensure attempt is not made to recreate an existing table...
     EXEC SQL DROP TABLE mf_table END-EXEC

* Create a table...
     EXEC SQL CREATE TABLE mf_table
                 (owner          char(20)
                 ,car_col        char(20)
                 ,nought_to_60   char(5))
     END-EXEC

     IF SQLCODE NOT = ZERO
        DISPLAY 'Error: Could not create table'
        DISPLAY SQLERRMC
        DISPLAY SQLERRML
        EXEC SQL DISCONNECT CURRENT END-EXEC
        STOP RUN
     END-IF

* Insert an SQL statement into host variable prep...
     MOVE "insert into mf_table values(?,?,?)" TO prep

* Prepare the statement...
     EXEC SQL
        PREPARE prep_stat FROM :prep
     END-EXEC

     IF SQLCODE NOT = ZERO
        DISPLAY 'Error: Could not prepare statement'
        DISPLAY SQLERRMC
        DISPLAY SQLERRML
        EXEC SQL DISCONNECT CURRENT END-EXEC
        STOP RUN
     END-IF

     MOVE "Owner" TO nme
     MOVE "Lamborghini" TO car
     MOVE "4.9" TO n60

* Execute the prepared statement using the above host variables...
     EXEC SQL
        EXECUTE prep_stat USING :nme, :car, :n60
     END-EXEC
     
     IF SQLCODE NOT = ZERO
        DISPLAY 'Error: Could not execute prepared statement.'
        DISPLAY SQLERRMC
        DISPLAY SQLERRML
        EXEC SQL DISCONNECT CURRENT END-EXEC
        STOP RUN
     END-IF

* Finally, drop the now unwanted table...
     EXEC SQL
        DROP TABLE mf_table
     END-EXEC

     IF SQLCODE NOT = ZERO
        DISPLAY 'Error: Could not drop table.'
        DISPLAY SQLERRMC
        DISPLAY SQLERRML
        EXEC SQL DISCONNECT CURRENT END-EXEC
        STOP RUN
     END-IF

     DISPLAY 'All statements executed.'
     EXEC SQL DISCONNECT CURRENT END-EXEC
     STOP RUN.