前へDataDirect ODBC ドライバ CP プリプロセッサ次へ

付録 D: 埋め込み SQL 文


D.1 BEGIN DECLARE SECTION

構文
>>---EXEC SQL---BEGIN DECLARE SECTION---END-EXEC--->< 
コメント

BEGIN DECLARE SECTION 文は、COBOL の変数宣言ができる場所ならどこでも含めることができます。 COBOL の宣言節の終わりを表すには、END DECLARE SECTION を使用します。

宣言節の中でデータ構造が定義されている場合は、ホスト変数には最下レベルの項目 (PIC 句付き) だけを使用できます。FETCH 文で指定された配列と SELECT INTO 文で指定されたレコード構造は例外となります。

WORKING-STORAGE SECTION. 

    EXEC SQL BEGIN DECLARE SECTION END-EXEC
    01 staff-id pic x(4). 
    01 last-name pic x(30). 
    EXEC SQL END DECLARE SECTION END-EXEC

D.2 BEGIN TRAN

構文
>>--EXEC SQL--.-BEGIN TRAN--------.-.------------------.--> 
              +-BEGIN TRANSACTION-+ +-transaction_name-+ 

 >--END-EXEC--><
パラメータ
transaction_name 無視されるオプション識別子を指定します。
コメント

トランザクションを開くには、AUTOCOMMIT モードの BEGIN TRAN 文を使用します。 AUTOCOMMIT モードでトランザクション開いた後に、COMMIT 文または ROLLBACK 文を実行してそのトランザクションを閉じると、AUTOCOMMIT モードに戻ります。

BEGIN TRAN 文により、とくにトランザクション管理と Micro Focus Embedded SQL Toolkit for Microsoft SQL Server に対して ANCI SQL 標準に準拠しない埋め込み SQL 実装との互換性が保たれます。

AUTOCOMMIT モードでトランザクションを開いていない場合は、この文は無効です。

EXEC SQL BEGIN TRANSACTION END-EXEC

D.3 CALL

構文
>>--EXEC SQL---.----------------.--.--------------.-->
	      +-FOR :row_count-+  +-:result_hvar-+ 

 >--CALL stored_procedure_name--.-------------.--->
                                |  +-- , --+  |
                                |  v       +  |
                                +-(parameter)-+
 >--END-EXEC--><
パラメータ
:row_count 整数型のホスト変数を指定します。結果およびパラメータのホスト変数がすべて同じサイズの配列で、 すべての要素を使用するわけではない場合には、使用する行数を指定します。CALL が DECLARE CURSOR 文の一部である場合は、FOR 句を使用することはできません。
:result_hvar 手続きの結果を受け取るホスト変数を指定します。
stored_procedure_name ストアドプロシージャの名前を指定します。
parameter 次の形式のリテラル、キーワード CURSOR、またはホスト変数パラメータを指定します。

[keyword=] :param_hvar [IN | INPUT | INOUT | OUT | OUTPUT]

ここで、

keyword は、キーワードパラメータ用の正式なパラメータです。

:param_hvar は、ホスト変数です。

IN には、入力パラメータを指定します。

INPUT には、入力パラメータを指定します。

INOUT には、入力/出力パラメータを指定します。

OUT には、出力パラメータを指定します。

OUTPUT には、出力パラメータを指定します。

CURSOR は、結果セットを返す Oracle 8 ストアドプロシージャに対してのみ使用されます。 CURSOR を使用すると、対応するパラメータがアンバウンドされます。

ストアドプロシージャの詳細については、『OpenESQL』 の章の『ストアドプロシージャ』を参照してください。

コメント

CALL 文を使用してストアドプロシージャを実行します。

EXEC SQL 
  CALL myProc(param1,param2) 
END-EXEC 
EXEC SQL 
  :myResult = CALL myFunction(namedParam=:paramValue) 
END-EXEC 
EXEC SQL 
  CALL getDept(:empName IN, :deptName OUT) 
END-EXEC 
EXEC SQL 
  DECLARE cities CURSOR FOR CALL locateStores(:userState) 
END-EXEC 

D.4 CLOSE

構文
>>--EXEC SQL--CLOSE--cursor_name--END-EXEC-->< 
パラメータ
cursor_name 前に宣言され、開かれたカーソルを指定します。
コメント

CLOSE 文により、未処理の行が廃棄され、カーソルによって保持されたロックが解除されます。 カーソルは、閉じる前に宣言して開いておく必要があります。開いたすべてのカーソルは、 プログラム終了時に自動的に閉じます。

* カーソルを宣言します...

 EXEC SQL
 DECLARE C1 CURSOR FOR
    SELECT staff_id, last_name
    FROM staff
 END-EXEC

 IF SQLCODE NOT = ZERO
    DISPLAY 'Error: Could not declare cursor.'
    DISPLAY SQLERRMC
    DISPLAY SQLERRML
    EXEC SQL DISCONNECT ALL END-EXEC
    STOP RUN
 END-IF

 EXEC SQL
    OPEN C1
 END-EXEC

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

 PERFORM UNTIL sqlcode NOT = ZERO
* データが正常にフェッチされている限り
* SQLCODE の値は 0 のままです
    EXEC SQL
       FETCH C1 INTO :staff-staff-id, :staff-last-name
    END-EXEC
    IF SQLCODE = ZERO
       DISPLAY "Staff ID: " staff-staff-id
       DISPLAY "Staff member's last name: " staff-last-name
    END-IF
 END-PERFORM

 EXEC SQL
    CLOSE C1
 END-EXEC

 IF SQLCODE NOT = ZERO
    DISPLAY 'Error: Could not close cursor.'
    DISPLAY SQLERRMC
    DISPLAY SQLERRML
 END-IF

D.5 COMMIT

構文
>>--EXEC SQL--COMMIT--.-------------.--.---------.-->
                      +-WORK--------+  +-RELEASE-+
                      +-TRAN--------+
                      +-TRANSACTION-+

 >--END-EXEC--><
パラメータ
WORK WORK、TRAN、TRANSACTION はオプションで、その意味は同じです。
RELEASE RELEASE が指定され、トランザクションが正常に COMMIT されると、 現在の接続は切断されます。
コメント

COMMIT 文により、現在の接続による現在のトランザクションで行われたすべての更新内容がデータベースに永続的に更新されます。

* スタッフ ID が 99 のスタッフメンバーに対し

* 複数のレコードが挿入されないようにします
 EXEC SQL
    DELETE FROM staff WHERE staff_id = 99
 END-EXEC

* ダミー値をテーブルに挿入します
 EXEC SQL
    INSERT INTO staff
    (staff_id
    ,last_name
    ,first_name
    ,age
    ,employment_date)
    VALUES
    (99
    ,'Lee'
    ,'Phil'
    ,19
    ,'1992-01-02')
 END-EXEC

 IF SQLCODE NOT = ZERO
    DISPLAY 'Error: Could not insert dummy values.'
    DISPLAY SQLERRMC
    DISPLAY SQLERRML
    EXEC SQL DISCONNECT ALL END-EXEC
    STOP RUN
 END-IF

 EXEC SQL
    COMMIT
 END-EXEC

* 正常にコミットされたことを確認します
 IF SQLCODE = ZERO
    DISPLAY 'Error: Could not commit values.'
    DISPLAY SQLERRMC
    DISPLAY SQLERRML
    EXEC SQL DISCONNECT CURRENT END-EXEC
    STOP RUN
 END-IF

 DISPLAY 'Values committed.'

* すでに挿入されているデータを削除します
 EXEC SQL
    DELETE FROM staff WHERE staff_id = 99
 END-EXEC

 IF SQLCODE NOT = ZERO
    DISPLAY 'Error: Could not delete dummy values.'
    DISPLAY SQLERRMC
    DISPLAY SQLERRML
    EXEC SQL DISCONNECT ALL END-EXEC
    STOP RUN
 END-IF

* データが削除されたことを確認し、接続をコミットして開放します。
 IF SQLCODE NOT = ZERO
    DISPLAY 'Error: Could not delete values.'
    DISPLAY SQLERRMC
    DISPLAY SQLERRML
    EXEC SQL DISCONNECT ALL END-EXEC
    STOP RUN
 END-IF
       
 EXEC SQL
    COMMIT WORK RELEASE
 END-EXEC

* データが削除されたことを確認し、接続を開放します。
 IF SQLCODE NOT = ZERO
    DISPLAY 'Error: Could not commit and release.'
    DISPLAY SQLERRMC
    DISPLAY SQLERRML
    EXEC SQL DISCONNECT CURRENT END-EXEC
 END-IF

 DISPLAY 'Values committed and connection released.'

D.6 CONNECT

構文
形式 1
>>--EXEC SQL--CONNECT TO--.-------------.--------------->
                          +-data_source-+

 >--.------------.--USER--.------------------.----------> 
    +-AS db_name-+        +-user-.-----------+ 
                                 +-.password-+

 >--.--------------------.------------------------------>
    +-WITH-.----.-PROMPT-+   
           +-NO-+

 >--.-----------------------------.--END-EXEC--><
    +-RETURNING output_connection-+
形式 2
>>--EXEC SQL--CONNECT user--.------------------------.-->
                            +-IDENTIFIED BY password-+
                            +-------"/"password------+

 >--.--------------.--.--------------------.------------> 
    +--AT db_name--+  +--USING data_source-+

 >--.--------------------.------------------------------>
    +-WITH-.----.-PROMPT-+   
           +-NO-+

 >--.-----------------------------.--END-EXEC--><
    +-RETURNING output_connection-+
形式 3
>>--EXEC SQL--CONNECT WITH PROMPT---------------------->

 >--.-----------------------------.--END-EXEC--><
    +-RETURNING output_connection-+ 
形式 4
>>--EXEC SQL--CONNECT RESET-.------.--END-EXEC-->< 
                            +-name-+
形式 5
>>--EXEC SQL--CONNECT DSN input_connection------------>

 >--.-----------------------------.--END-EXEC--><
    +-RETURNING output_connection-+ 
形式 6
>>--EXEC SQL--CONNECT USING input_connection---------->

 >--.------------.--.--------------------.------------> 
    +-AT db_name-+  +-WITH-.----.-PROMPT-+
                           +-NO-+

 >--.------------------------------.--END-EXEC--><
    +-RETURNING output_connection--+ 
パラメータ
data_source ODBC データソースの名前を指定します。data_source を省略した場合は、 デフォルトの ODBC データソースが使用されます。データソースは、リテラルまたはホスト変数で指定できます。
db_name 接続の名前を指定します。接続名は最大 30 字で、英数字とファイル名に有効な任意の記号が使用できます。最初の文字は数字以外の文字にする必要があります。接続名には、埋め込み SQL のキーワード、CURRENT、DEFAULT、ALL を使用しないでください。db_name を省略した場合は、 DEFAULT が使用されます。db_name はリテラルまたはホスト変数で指定できます。
user 指定したデータソースに有効なユーザ ID を指定します。
password 指定したユーザ ID に有効なパスワードを指定します。
output_connection 特定のデータソースの接続に使用するために ODBC によって接続文字列で定義された PIC X(n) テキスト列を指定します。 その後に、この文字列を CONNECT USING 文の input_connection として指定できます。
input_connection データソースに接続するために ODBC によって使用された接続情報を含む PIC X(n) テキスト列を指定します。テキスト列はリテラルまたはホスト変数で指定できます。
RESET 指定した接続をリセット (切断) します。
name name には、CURRENT、DEFAULT または ALL を指定できます。
コメント

CONNECT 文により、指定したユーザ ID とパスワードを使用した特定のデータベースに接続されます。

1 つの接続だけを使用する場合は、接続に名前を付ける必要はありません。複数の接続を使用する場合は、 各接続に名前を指定する必要があります。接続名はプロセス内で共通です。名前の付いた接続は、 別々にコンパイルされ、単一の実行可能モジュールにリンクしたプログラム間で共有できます。

CONNECT 文が正常に実行されると、すべてのデータベーストランザクションは、CONNECT RESET が最後に宣言されている場合以外は、 現在の接続となります。別の接続を使用するには、SET CONNECTION 文を使用する必要があります。

管理を簡素化するには、CONNECT DSN および CONNECT USING を使用します。

CONNECT TO、CONNECT、CONNECT DSN および CONNECT USING を使用すると、接続情報をアプリケーションに返すことができます。


備考


* 接続方法 1

 MOVE 'servername' TO svr
 MOVE 'username.password' TO usr

 EXEC SQL
    CONNECT TO :svr USER :usr
 END-EXEC

* 接続方法 2
 EXEC SQL
    CONNECT 'username.password' USING 'servername'
 END-EXEC
      
* 接続方法 3 
 EXEC SQL
    CONNECT WITH PROMPT
 END-EXEC
* 接続方法 4
 EXEC SQL
    CONNECT RESET
 END-EXEC

* 接続方法 5
 EXEC SQL
    CONNECT USING FileDSN=Oracle8;PWD=tiger'
 END-EXEC

上記の例は、File DSN を使用します。


* 接続方法 6 01 connectString PIC X(72) value 'DRIVER={Microsoft Excel Driver (*.xls)}; '&'DBQ=c:\demo\demo.xls;' &'DRIVERID=22'. procedure division. EXEC SQL CONNECT USING :connectString END-EXEC

上記の例は、データソースを設定しないで Excel スプレッドシートに接続します。


D.7 DECLARE CURSOR

構文
>>--EXEC SQL--.------------.--DECLARE cursor_name----->
              +-AT db_name-+

 >--.-------------.--.-----------.--.-------------.--->
    +-SENSITIVE---+  +-FORWARD---+  +-LOCK--------+
    +-INSENSITIVE-+  +-KEYSET----+  +-LOCKCC------+
                     +-DYNAMIC---+  +-OPTIMISTICD-+
                     +-STATIC----+  +-OPTCC-------+
                     +-SCROLL----+  +-OPTCCVAL----+
                                    +-READ ONLY---+
                                    +-READONLY----+

 >--CURSOR--.-----------.----------------------------->
            +-WITH HOLD-+       

 >--FOR--.----------------------------.--------------->
          +-select_stmt----------------+
          +-stored_procedure_call_stmt-+
          +-prepared_stmt_name---------+

 >--.-------------------------------.--END-EXEC-->< 
    +-FOR READ ONLY-----------------+
    +-FOR UPDATE-.----------------.-+
                 +-OF column_list-+
パラメータ
db_name DECLARE DATABASE を使用して宣言されているデータベースの名前を指定します。
cursor_name 以後の文でカーソルを示すためのカーソル名を指定します。カーソル名には、有効な任意のファイル名の文字を入れることができます。カーソル名は最大 30 字で、最初の文字は数字以外の文字にする必要があります。
select_stmt 任意の有効な SQL SELECT文、あるいは結果セットを返すストアドプロシージャの QUERY ODBC 文または CALL 文を指定します。
prepared_stmt_name 準備された SQL SELECT 文または QUERY ODBC 文の名前を指定します。
stored_procedure_call_stmt 結果セットを返す有効なストアドプロシージャを指定します。
column_list コンマで区切られた列名のリストを指定します。
コメント

DECLARE CURSOR 文により、指定された SELECT 文がカーソル名に関連付けられ、 FETCH 文を使用したデータ行を検索できます。

2 つの別々のコンパイルしたプログラムが同じカーソル名を共有することはできません。 特定のカーソル名を参照する文は、すべて同時にコンパイルする必要があります。

DECLARE CURSOR 文は、最初のカーソル参照よりも前にする必要があります。SELECT 文は、 カーソルが開いたときに実行されます。SELECT 文には次の規則が適用されます。


注:


EXEC SQL DECLARE C1 CURSOR FOR
   SELECT last_name, first_name FROM staff
END-EXEC

EXEC SQL DECLARE C2 CURSOR FOR
   QUERY ODBC COLUMNS TABLENAME 'staff'
END-EXEC

D.8 DECLARE DATABASE

構文
>>--EXEC SQL--DECLARE db_name--DATABASE--END-EXEC-->< 
パラメータ
db_name データベースに関連付けられた名前を指定します。ホスト変数ではなく、識別子にする必要があります。 引用符を含めることはできません。
コメント

DECLARE DATABASE 文により、データベースの名前が宣言されます。 DECLARE db_name を宣言してから、CONNECT … AT db_name 文を使用する必要があります。


注: EXECUTE IMMEDIATE、または PREPARE および EXECUTE と一緒に、DECLARE DATABASE を使用することはできません。



D.9 DELETE (位置付け)

構文
>>--EXEC SQL--DELETE--FROM--table_name----------------> 

 >--WHERE CURRENT OF--cursor_name--END-EXEC--><
パラメータ
table_name SELECTFROM オプションで使用するものと同じテーブル名 (DECLARE CURSOR を参照) を指定します。
cursor_name 前に宣言された開いているフェッチされたカーソルを指定します。
コメント

ODBC は位置付け削除をサポートします。位置付け削除は、拡張構文でカーソルを使って最後にフェッチされた行を削除します (ODBC 1.0 では主要構文で更新されていましたが、ODBC 2.0では拡張構文に移行しました)。 すべてのドライバが位置付け削除をサポートしているわけではありません。ただし、OpenESQL では、位置付け更新および位置付け削除が容易にできるように、ODBC カーソル名を COBOL カーソル名と同じ名前に設定します。

ODBC ドライバによっては、カーソルが使用する SELECT 文は、位置付け削除を可能にするために FOR UPDATE 句を含む必要があります。

位置付け削除ではホスト配列を使用できません。

標準 SQL 文で使用されるもう 1 つの形式 DELETE は、検索削除と呼ばれます。

ほとんどのデータソースでは、SET 文によって指定される、または DECLARE CURSOR 文で指定される SCROLLOPTION と CONCURRENCY の特定の組み合わせが必要です。

ODBC カーソルのライブラリにより、位置付け削除の制限付き実装が提供されます。SQL(USECURLIB=YES) でコンパイルし、SCROLLOPTION STATIC および CONCURRENCY OPTCCVAL (または OPTIMISTIC) を使用することによって、その削除を行うことができます。

* 更新のためにカーソルを宣言します

 EXEC SQL DECLARE C1 CURSOR FOR
    SELECT staff_id, last_name FROM staff FOR UPDATE
 END-EXEC

 IF SQLCODE NOT = ZERO
    DISPLAY 'Error: Could not declare cursor for update.'
    DISPLAY SQLERRMC
    DISPLAY SQLERRML
    EXEC SQL DISCONNECT ALL END-EXEC
    STOP RUN
 END-IF

* カーソルを開きます
 EXEC SQL
    OPEN C1 
 END-EXEC
 IF SQLCODE NOT = ZERO
    DISPLAY 'Error: Could not open cursor for update.'
    DISPLAY SQLERRMC
    DISPLAY SQLERRML
    EXEC SQL DISCONNECT ALL END-EXEC
    STOP RUN
 END-IF

* スタッフメンバーの詳細が表示され
* 特定のメンバーを削除する機会をユーザに与えます
 PERFORM UNTIL SQLCODE NOT = ZERO
    EXEC SQL FETCH C1 INTO :staff-id,:last-name END-EXEC
    IF SQLCODE = ZERO
       DISPLAY 'Staff ID:     ' staff-id
       DISPLAY 'Last name:    ' last-name
       DISPLAY 'Delete <y/n>? ' WITH NO ADVANCING
       ACCEPT usr-input
       IF usr-input = 'y'
          EXEC SQL
             DELETE FROM staff WHERE CURRENT OF C1
          END-EXEC
          IF SQLCODE NOT = ZERO
             DISPLAY 'Error: Could not delete record.'
             DISPLAY SQLERRMC
             DISPLAY SQLERRML
          END-IF
       END-IF
    END-IF
 END-PERFORM

D.10 DELETE (検索)

構文
>>--EXEC SQL--.-------------------.--DELETE--.------.-->
              +-FOR :host_integer-+          +-FROM-+

 >--.-table_name-.--.-------------------------.-------->
    +-view_name--+  +-WHERE search_conditions-+

 >--END-EXEC--><
パラメータ
:host_integer 処理されるホスト配列要素の最大数を指定するホスト変数を指定します。 PIC S9(4) COMP-5 で宣言する必要があります。
FROM オプションのキーワードを指定します。ANSI SQL 92 に準拠するために必要です。
table_name 削除操作の対象となるテーブルを指定します。
view_name 削除操作の対象となるビューを指定します。
WHERE 削除する行を示す標準 SQL の WHERE 句を指定します。
search_conditions 標準 SQL の WHERE 句の後に続く任意の有効な式を指定します。
コメント

DELETE は標準 SQL 文です。構文の詳細については、ODBC ドライバに付属しているマニュアルを参照してください。

WHERE 句には、単一のホスト変数とホスト配列を混在させることはできません。 ホスト変数の 1 つが配列の場合には、ホスト変数をすべて配列にする必要があります。

DELETE (検索) 文により、検索条件に一致するテーブルの行が削除されます。 WHERE 句を指定しない場合は、名前の付いたテーブルの行すべてが削除されます。

EXEC SQL
   DELETE FROM staff WHERE staff_id = 99
END-EXEC

D.11 DESCRIBE

構文
>>--EXEC SQL--DESCRIBE--.---------------------.------->
                         +-SELECT LIST FOR-----+ 
                         +-BIND VARIABLES FOR--+ 
  
 >--prepared_stmt_name--INTO--:sqlda_struct--END-EXEC-->< 
パラメータ
prepared_stmt_name 準備された SQL SELECT 文または QUERY ODBC 文の名前を指定します。
:sqlda_struct 書き込み対象となる出力 SQL 記述子領域 (SQLDA) データ構造を指定するホスト変数を指定します。 コロンを使用して、その他の埋め込み SQL 実装との互換性を保つことができます。
コメント

DESCRIBE 文により、準備された動的 SQL 文に関する情報が提供されます。 この文は、指定した SQLDA データ構造に、指定した準備された文によって返されるデータ型、長さ、および列名が書き込まれます。

SELECT LIST FOR または BIND VARIABLES FOR のどちらも指定しない場合は、SELECT LIST がデフォルトになります。BIND VARIABLES FOR を指定した場合は、結果列に関する情報ではなく、入力パラメータに関する情報が SQLDA に返されます。

DESCRIBE 文により、列の数が SQLDA 構造の sqld フィールドに挿入されます。 非選択文が準備された場合は、sqld が 0 に設定されます。 DESCRIBE を呼び出す前に SQLDA データ構造の次のフィールドをアプリケーションで初期化する必要があります。

sqln 構造を持つことができる sqlvar (列記述子) 項目の最大数。
sqldabc SQLDA の最大サイズ。sqln * 44 + 16 によって求められます。

sqln を 0 に設定した場合、列記述子項目は作成されませんが、 sqld は必要な項目数に設定されます。DESCRIBE 文は、INTO 句付きの PREPARE 文と似た動作をします。

注:

ほとんどのドライバは、DESCRIBE BIND VARIABLES に必要な ODBC 呼び出しを完全には実装していません。

EXEC SQL INCLUDE SQLDA END-EXEC

EXEC SQL BEGIN DECLARE SECTION END-EXEC
01 statement                    pic x(80).
EXEC SQL END DECLARE SECTION END-EXEC

EXEC SQL
   DECLARE C1 CURSOR FOR stmt1
END-EXEC

move "select * from dept" into statement

move 20 to sqln
compute sqldabc = 16 + 44 * sqln
EXEC SQL
   PREPARE stmt1 FROM :statement
END-EXEC
EXEC SQL 
   DESCRIBE stmt1 INTO :sqlda 
END-EXEC

* "sqlda" データ構造体には
* 動的 SQL 文の記述が含まれています
EXEC SQL 
   OPEN C1 
END-EXEC

* バッファのアドレスおよび長さを追加して SQLDA を終了します

EXEC SQL
   FETCH C1 USING DESCRIPTOR :sqlda
END-EXEC

D.12 DISCONNECT

構文
>>--EXEC SQL--DISCONNECT--.-name----.--END-EXEC--><
                          +-ALL-----+
                          +-CURRENT-+
                          +-DEFAULT-+
パラメータ
name 接続名を指定します。
ALL すべての接続 (SQL コンパイラ指令の INIT オプション指定時の自動接続を含む) を切断します。
CURRENT 現在の接続を切断します。現在の接続とは、CONNECT によって最後に接続された接続、または SET CONNECTION によって設定される以後の接続です。
DEFAULT デフォルトの接続を切断します。デフォルトの接続とは、接続名を指定していない CONNECT 文による接続です。
コメント

DISCONNECT 文により、データベースとの接続が切断されます。さらに、その接続に対して開いたすべてのカーソルは自動的に閉じます。

EXEC SQL CONNECT TO "srv1" AS server1 USER "sa." END-EXEC
EXEC SQL CONNECT TO "srv2" AS server2 USER "sa." END-EXEC
…
EXEC SQL DISCONNECT server1 END-EXEC
EXEC SQL DISCONNECT server2 END-EXEC.

D.13 END DECLARE SECTION

構文
>>--EXEC SQL--END DECLARE SECTION--END-EXEC-->< 
コメント

END DECLARE SECTION 文により、BEGIN DECLARE SECTION 文によって開始したホスト変数宣言接続が終了します。

WORKING-STORAGE SECTION.
   EXEC SQL BEGIN DECLARE SECTION END-EXEC
   01 staff-id        pic x(4).
   01 last-name       pic x(30).
   EXEC SQL END DECLARE SECTION END-EXEC

D.14 EXECSP

構文
>>--EXEC SQL-.----------------.--EXECSP-.--------------.-->
	    +-FOR :row_count-+         +-:result_hvar-+

 >--stored_procedure_name--.-------------.---------------->
                           |  +-- , --+  |
                           |  v       |  |
                           +-(parameter)-+

 >--.----------------.--END-EXEC--><
    +-WITH RECOMPILE-+
パラメータ
:row_count 整数型のホスト変数を指定します。結果およびパラメータのホスト変数がすべて同じサイズの配列で、すべての要素を使用するわけではない場合は、 使用する要素の数を指定します。EXECSP が DECLARE CURSOR 文の一部である場合は、 FOR 句を使用できません。
:result_hvar 手続きの結果を受け取るホスト変数を指定します。
stored_procedure_name ストアドプロシージャの名前を指定します。
parameter 次の形式のリテラルまたはホスト変数パラメータを指定します。

[keyword=] :param_hvar [OUT | OUTPUT]

ここで、

keyword は、キーワードパラメータの正式なパラメータ名です。

:param_hvar は、ホスト変数です。

OUT には、出力パラメータを指定します。

OUTPUT には、出力パラメータを指定します。

WITH RECOMPILE これは無視されるため、影響はありません。構文の互換性を保つためだけのパラメータです。

ストアドプロシージャの詳細については、『OpenESQL』 の章の『ストアドプロシージャ』を参照してください。

コメント

EXECSP 文は、ストアドプロシージャを実行するために使用されます。この文は、CALL 文と代替え可能であり、Micro Focus Embedded SQL Toolkit for Microsoft SQL Server と下位互換性があります。可能な場合はいつでも、CALL 文を EXECSP 文に優先して使用できます。

EXEC SQL
   EXECSP myProc param1,param2
END-EXEC

EXEC SQL
   EXECSP :myResult = myFunction namedParam = :paramValue
END-EXEC

EXEC SQL
   EXECSP getDept :empName, :deptName OUT
END-EXEC

EXEC SQL
   DECLARE cities CURSOR FOR EXECSP locateStores :userState
END-EXEC

D.15 EXECUTE

構文
>>--EXEC SQL--.----------------.--EXECUTE------------------>
              +-FOR :row_count-+

 >--prepared_stmt_name-.---------------------------------.->
                       +--USING DESCRIPTOR :sqlda_struct-+
                       | +--- , -----+                   |
                       | v           |                   |
                       +--USING :hvar--------------------+

 >--END-EXEC--><
パラメータ
:row_count 整数型のホスト変数を指定します。結果およびパラメータのホスト変数がすべて同じサイズの配列で、 すべての要素を使用するわけではない場合は、使用する行数を指定します。EXECUTE が DECLARE CURSOR 文の一部である場合は、FOR 句を使用することはできません。
prepared_stmt_name 前に準備された SQL 文を指定します。
:sqlda_struct 入力値の記述を含む、前に宣言された SQLDA データ構造を指定するホスト変数を指定します。その他の埋め込み SQL 実装との互換性を保つためにコロンを使用できます。
:hvar 1 つまたは複数の入力ホスト変数を指定します。
コメント

EXECUTE 文により、動的 SQL 文が処理されます。パラメータマーカがある場合にはそれを値に置き換えてから、指定した準備された SQL 文が実行されます。(準備された文は、PREPARE 文を使って作成します。) 結果を返さない文だけが許可されます。

準備された文にパラメータマーカが入っている場合は、EXECUTE 文には、ホスト変数と同数の USING :hvar オプション、またはアプリケーションによってすでに書き込まれた SQLDA データ構造を示す USING DESCRIPTOR :sqlda_struct オプションを含める必要があります。

準備された文のパラメータマーカの数は、sqldata 項目の数 (USING DESCRIPTOR :sqlda) またはホスト変数 (using :hvar) と一致している必要があります。

* 動的に実行する文を保存します...

 MOVE "INSERT INTO staff VALUES(?,?,?,?,?)" TO stmtbuf.

* 既存のレコードが挿入されることのないようにします
 EXEC SQL
    DELETE FROM staff WHERE staff_id = 99
 END-EXEC

* 文を準備します
 EXEC SQL
    PREPARE st FROM :stmtbuf
 END-EXEC.

 MOVE 99 TO staff-id
 MOVE 'Lee' TO last-name
 MOVE 'Phil' TO first-name
 MOVE 19 TO age
 MOVE '1997-01-01' TO employment-date

* 現在の値で文を実行します
 EXEC SQL
    EXECUTE st USING :staff-id, :last-name
		    ,:first-name, :age, :employment-date
 END-EXEC
 IF SQLCODE = ZERO
    DISPLAY 'Statement executed.'
 ELSE
    DISPLAY 'Error: Could not execute statement.'
    DISPLAY SQLERRMC
    DISPLAY SQLERRML
    EXEC SQL DISCONNECT ALL END-EXEC
    STOP RUN
 END-IF

* 最後に、入力値を削除します
 EXEC SQL
    DELETE FROM staff where staff_id = 99
 END-EXEC
 IF SQLCODE = ZERO
    DISPLAY 'Values deleted.'
 ELSE
    DISPLAY 'Error: Could not delete inserted values.'
    DISPLAY SQLERRMC
    DISPLAY SQLERRML
    EXEC SQL DISCONNECT ALL END-EXEC
    STOP RUN
 END-IF

D.16 EXECUTE IMMEDIATE

構文
>>--EXEC SQL--.-------------------.--EXECUTE IMMEDIATE-->
              +-FOR :row_count----+

 >--:stmt_hvar--END-EXEC-><
パラメータ
:row_count 整数型のホスト変数を指定します。結果およびパラメータのホスト変数がすべて同じサイズの配列で、 すべての要素を使用するわけではない場合は、使用する行数を指定します。EXECUTE IMMEDIATE が DECLARE CURSOR 文の一部である場合は、FOR 句を使用することはできません。
:stmt_hvar 文字列ホスト変数を指定します。
コメント

EXECUTE IMMEDIATE 文には、入力パラメータマーカまたはホスト変数を入れることはできません。また、結果を返すこともできません。 よって、この文の結果は廃棄されます。さらに、この文には埋め込み SQL に対して排他的な SQL キーワードを入れることもできません。

行が返される場合、SQLCODE が +1 に設定されます。

Microsoft SQL Server に固有の SET 文に対して、EXECUTE IMMEDIATE を使用する必要があります (つまり、そのサーバで実行する目的で使用されます)。

 EXEC SQL
    DELETE FROM staff WHERE staff_id = 99
 END-EXEC

* 必要な SQL 文の準備を始めます
 MOVE "insert into staff (staff_id, last_name, " & 
      "first_name, age, employment_date) VALUES (99, " &  
      "'Lee', 'Phillip',19, '1992-01-02')" TO prep

* 文を準備するのに EXECUTE IMMEDIATE は必要ないことに
* 注意してください
 EXEC SQL
    EXECUTE IMMEDIATE :prep
 END-EXEC

* 実行されたことを確認します...
 IF SQLCODE = ZERO
    DISPLAY 'Statement executed OK.'
 ELSE
    DISPLAY 'Error: Statement not executed.'
    DISPLAY SQLERRMC
    DISPLAY SQLERRML
    EXEC SQL DISCONNECT ALL END-EXEC
    STOP RUN
 END-IF

* 再度同じ処理を一通り実行して
* 今度は挿入されている値を削除します
 MOVE "delete from staff where staff_id = 99" TO prep

 EXEC SQL
    EXECUTE IMMEDIATE :prep
 END-EXEC

 IF SQLCODE = ZERO
    DISPLAY 'Statement executed OK.'
 ELSE
    DISPLAY 'Error: Statement not executed.'
    DISPLAY SQLERRMC
    DISPLAY SQLERRML
    EXEC SQL DISCONNECT ALL END-EXEC
    STOP RUN
 END-IF

D.17 FETCH

構文
>>--EXEC SQL-.-------------------.-------------------->
	    +-FOR :host_integer-+

 >--FETCH--.----------.--cursor_name------------------>
           +-PREVIOUS-+
           +-LAST-----+
           +-PRIOR----+
           +-FIRST----+
           +-NEXT-----+

 >--.--------------------------------.--END-EXEC--><
    +-USING DESCRIPTOR :sqlda_struct-+
    | +-- , ----+                    |
    | v         |                    |
    +--INTO :hvar--------------------+ 
パラメータ
:host_integer 処理されるホスト配列要素の最大数を指定するホスト変数を指定します。PIC S9(4) COMP-5 で宣言する必要があります。
cursor_name 前に宣言して開いたカーソルを指定します。
:sqlda_struct 前に DESCRIBE によって書き込まれ、出力値のアドレスが入っている SQLDA データ構造を指定するホスト変数を指定します。 このオプションは、準備された SELECT 文によって宣言されたカーソルと一緒に使用する場合に限り有効です。 (SELECT 文は、PREPARE 文を使って準備されます。) その他の埋め込み SQL 実装との互換性を保つためにコロンを使用できます。
:hvar データを受け取る 1 つまたは複数のホスト変数を指定します。
コメント

FETCH 文により、カーソルの結果セットから行が検索され、その行にある列の値が対応するホスト変数 (または SQLDA データ構造で指定されたアドレス) に書き込まれます。 デフォルトでは、FETCH 文により次の行が検索されますが、前の行、最後の行、前の行よりも優先する行、または最初の行も指定できます。 これ以上フェッチする行がない場合は、SQLCODE が 100、SQLSTATE が "02000" に設定されます。

OPEN cursor_name 文は FETCH 文より前にあり、カーソルは FETCH の実行中に開いておく必要があります。PREVIOUS、LAST、PRIOR、FIRST、または NEXT を使用する場合は、 DECLARE CURSOR 文、または SET SCROLLOPTION 文および SET CONURRENCY 文を指定して、適切なカーソルオプションも設定する必要があります。 さらに、ホスト変数のデータ型は、対応するデータベース列のデータ型と互換性がなければなりません。

列の数がホスト変数の数よりも少ない場合は、SQLWARN3 の値が W に設定されます。エラーが発生した場合には、 それ以上の列は処理されません。(処理済みの列は元に戻りません。)

別な方法として、:hvar 変数に、カーソル宣言文の選択リストにある列にそれぞれ対応する複数のフィールドが入った COBOL レコードを指定できます。この形式を使用する場合は、SQL コンパイラ指令の DB2 オプションを指定する必要があります (この形式を使用すると、PREPARE INTO 文と DESCRIBE 文が COBOL コンパイラによって拒否されるので注意してください)。

ANSI92ENTRY を設定して、NULL 値をフェッチした場合に、NULL 標識がなければ SQLCODE が -19425 に設定されます。 ANSI92ENTRY を設定していない場合は、SQLCODE が 0 になります。どちらの場合も、 SQLSTATE は 22002、SQLWARN2 は W になります。

INTO 句のホスト変数の 1 つが配列である場合、INTO 句のホスト変数はすべて配列にする必要があります。

* 特定の SQL 文のためにカーソルを宣言します

 EXEC SQL DECLARE C1 CURSOR FOR
    SELECT last_name, first_name FROM staff
 END-EXEC

 EXEC SQL OPEN C1 END-EXEC

* カーソルから現在の値がホスト変数にフェッチされ
* すべてが正常に進むと
* ホスト変数の値が表示されます

 PERFORM UNTIL SQLCODE NOT = ZERO
    EXEC SQL
       FETCH C1 INTO :lname,:fname
    END-EXEC
    IF SQLCODE NOT = ZERO AND SQLCODE NOT = 100
       DISPLAY 'Error: Could not perform fetch'
       DISPLAY SQLERRML
       DISPLAY SQLERRMC
       EXEC SQL DISCONNECT ALL END-EXEC
       STOP RUN
    END-IF
    DISPLAY 'First name: 'fname
    DISPLAY 'Last name : 'lname
    DISPLAY SPACES
 END-PERFORM

D.18 INCLUDE

構文
>>--EXEC SQL--INCLUDE--.-SQLCA----.--END-EXEC--><
                       +-SQLDA----+
                       +-filename-+
パラメータ
SQLCA SQL 通信領域 (SQLCA) データ構造がアクセスされることを示します。
SQLDA SQLDA データ構造がアクセスされることを示します。
filename この時点でソースに含まれているファイルを示します (COBOL の COPY 文と同様です)。
コメント

この文には、COBOL プログラムで指定された SQL データ構造またはソースファイルの定義が含まれています。

この文では、対応する .cpy ファイルが使用されます。sqlca.cpy および sqlda.cpy が 現在のディレクトリにあるか、COBCPY 環境変数によってこれらのファイルが入ったディレクトリが指定されていることを確認します。

EXEC SQL INCLUDE SQLCA END-EXEC
EXEC SQL INCLUDE SQLDA END-EXEC
EXEC SQL INCLUDE MYFILE END-EXEC

D.19 INSERT

構文
>>--EXEC SQL-.-------------------.--.------------.-------> 
             +-FOR :host_integer-+  +-AT db_name-+ 
  
 >--INSERT--.------.--.-table_name-.--.---------------.-->
            +-INTO-+  +-view_name--+  +-(column_list)-+
      
            +-------- , ------+  
            v                 |  
 >--VALUES (constant_expression)--END-EXEC--><
パラメータ
:host_integer 処理されるホスト配列要素の最大数を指定するホスト変数を指定します。 PIC S9(4) COMP-5 で宣言する必要があります。
db_name DECLARE DATABASE を使用して宣言されているデータベースの名前を指定します。
table_name 行を挿入するテーブルを指定します。
view_name 行を挿入するビューを指定します。
INTO 省略可能なキーワードです。ANSI SQL 92 に準拠する場合は必要です。
column_list データに追加する 1 つまたは複数の列のリストを指定します。 列の順序は任意ですが、入力データは列と同じ順序にする必要があります。 列リストが必要なのは、テーブルにある一部の列 (すべての列ではなく) がデータを受け取るときだけです。 列リストの項目はかっこで囲みます。列リストを指定しない場合は、受け取るテーブルにあるすべての列を (CREATE TABLE の順序で) 受け取るものとみなされます。

列リストによって、値を入力する順序が決定されます。

VALUES 定数式のリストを導入します。
constant_expression 指定された列の定数または NULL 値を指定します。 値リストはかっこで囲み、明示的または暗示的な列リストと一致している必要があります。 数値以外の定数は一重引用符または二重引用符で囲みます。
コメント

INSERT 文は直接、ODBC ドライバに渡されます。詳細な構文については、ODBC ドライバに 付属しているマニュアルを参照してください。

WHERE 句のホスト変数が配列の場合は、INSERT 文が各配列要素のセットに対して 1 回ずつ実行されます。

INSERT 文により、新しい行がテーブルに追加されます。既存の行の列値を変更するには、UPDATE 文を使用します。

列が NULL 値を許可するように定義されている場合、列リストと VALUES リストの項目を省略できます。

1 つの文の中で、テーブルから行を選択してその行を同じテーブルに挿入できます。

*カーソルを宣言します...

 EXEC SQL
 DECLARE C1 CURSOR FOR
    SELECT staff_id, last_name
    FROM staff
 END-EXEC

 IF SQLCODE NOT = ZERO
    DISPLAY 'Error: Could not declare cursor.'
    DISPLAY SQLERRMC
    DISPLAY SQLERRML
    EXEC SQL DISCONNECT ALL END-EXEC
    STOP RUN
 END-IF

 EXEC SQL
    OPEN C1
 END-EXEC

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

 PERFORM UNTIL sqlcode NOT = ZERO
* データが正常にフェッチされている限り
* SQLCODE の値は 0 のままです
    EXEC SQL
       FETCH C1 INTO :staff-staff-id, :staff-last-name
    END-EXEC
    IF SQLCODE = ZERO
       DISPLAY "Staff ID: " staff-staff-id
       DISPLAY "Staff member's last name: " staff-last-name
    END-IF
 END-PERFORM

    EXEC SQL
       CLOSE C1
    END-EXEC

    IF SQLCODE NOT = ZERO
       DISPLAY 'Error: Could not close cursor.'
       DISPLAY SQLERRMC
       DISPLAY SQLERRML
    END-IF

D.20 OPEN

構文
>>--EXEC SQL--OPEN--cursor_name------------------------> 
  
 >--.---------------------------------.--END-EXEC--><
    +--USING DESCRIPTOR :sqlda_struct-+
    | +---- , ----+                   |       
    | v           |                   |
    +--USING :hvar--------------------+
パラメータ
cursor_name 前に宣言されたカーソルを指定します。
:sqlda_struct アプリケーションによって前に構築された SQLDA データ構造を指定するホスト変数を指定します。 SQLDA データ構造には、各入力パラメータのアドレス、データ型、長さが入っています。 このオプションは、DECLARE 文で準備された SQL 文を参照するカーソルと一緒に使用する場合に限り有効です。 その他の埋め込み SQL 実装との互換性を保つためにコロンを使用できます。
:hvar SELECT 文にあるパラメータマーカに対応する 1 つまたは複数の入力ホスト変数を指定します。 このオプションは、DECLARE 文で準備された SQL 文を参照するカーソルと一緒に使用する場合に限り有効です。
コメント

OPEN 文により、対応する DECLARE CURSOR 文で指定された SELECT 文が実行され、FETCH 文によって 1 度に 1 行ずつアクセスされる結果セットが生成されます。

カーソルが静的 SELECT 文 (つまり、準備されていない文) によって宣言された場合は、SELECT 文にホスト変数を入れることができますが、パラメータマーカを入れることはできません。 ホストの現在の値が OPEN 文の実行時に置き換えられます。静的に宣言されたカーソルの場合、OPEN 文に :hvar または USING DESCRIPTOR :sqlda_struct オプションを入れることはできません。

カーソルを動的 SELECT 文 (つまり、準備された文) によって宣言された場合は、SELECT 文にパラメータマーカを入れることができますが、ホスト変数を入れることはできません。 パラメータマーカは、SELECT 文の中で列値か許可されている場所ならどこでも使用できます。 SELECT 文にパラメータマーカがある場合は、OPEN 文に、ホスト変数と同数の USING :hvar オプション 、またはアプリケーションによってすでに書き込まれた SQLDA データ構造を示す :sqlda_struct オプションのどちらかを含める必要があります。

USING DESCRIPTOR :sqlda_struct オプションでは、プログラム変数の値は SELECT 文にあるパラメータマーカに置き換えられます。これらのプログラム変数は、SQLDA データ構造にある対応する sqlda 項目によってアドレス指定されます。

SELECT 文のパラメータマーカの数は、sqldata 項目 (USING DESCRIPTOR :sqlda_struct) または OPEN 文のホスト変数 (USING :hvar) の数と一致している必要があります。

* カーソルを宣言します...

 EXEC SQL
 DECLARE C1 CURSOR FOR
    SELECT staff_id, last_name
    FROM staff
 END-EXEC

 IF SQLCODE NOT = ZERO
    DISPLAY 'Error: Could not declare cursor.'
    DISPLAY SQLERRMC
    DISPLAY SQLERRML
    EXEC SQL DISCONNECT ALL END-EXEC
    STOP RUN
 END-IF

 EXEC SQL
    OPEN C1
 END-EXEC

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

 PERFORM UNTIL sqlcode NOT = ZERO
* データが正常にフェッチされている限り
* SQLCODE の値は 0 のままです
    EXEC SQL
       FETCH C1 INTO :staff-staff-id, :staff-last-name
    END-EXEC
    IF SQLCODE = ZERO
       DISPLAY "Staff ID: " staff-staff-id
       DISPLAY "Staff member's last name: " staff-last-name
    END-IF
    END-PERFORM

    EXEC SQL
       CLOSE C1
    END-EXEC

    IF SQLCODE NOT = ZERO
       DISPLAY 'Error: Could not close cursor.'
       DISPLAY SQLERRMC
       DISPLAY SQLERRML
    END-IF

D.21 PREPARE

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

 >--FROM--:hvar--END-EXEC--><
パラメータ
stmt_name 準備された文の名前を指定します。これは、以後の EXECUTE 文あるいは OPEN 文および/または前の DECLARE CURSOR 文によって使用されます。
:sqlda 書き込み対象となる出力 SQLDA データ構造を指定するホスト変数を指定します。 その他の埋め込み SQL 実装との互換性を保つためにコロンを使用できます。
:hvar SQL 文を含むホスト変数を指定します。
コメント

PREPARE 文により、動的 SQL 文が処理されます。

次の 2 つのいずれかの目的で PREPARE された文を使用できます。

EXECUTE 文によって準備された文が使用される場合は、結果を返す SQL 文を :hvar に入れることはできません。

単選択文 (SELECT INTO) は、動的 SQL 文では許可されないため、 単選択文は準備することができません。

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

INTO :sqlda オプションは、DESCRIBE および PREPARE の機能を併合します。したがって、次の 2 つのコード例の機能は同じです。

 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 文の使用に関する詳細については、『動的 SQL』の章の 『動的 SQL 文の準備』を参照してください。

 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

* 既存のテーブルが再び作成されないようにします...
 EXEC SQL DROP TABLE mf_table END-EXEC

* テーブルを作成します...
 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

* 準備のため SQL 文をホスト変数に挿入します...
 MOVE "insert into mf_table values(?,?,?)" TO prep

* 文を準備します...
 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

* 上記のホスト変数を使用して
* 準備された文を実行します...
 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

* 最後に、現在は不要なテーブルをドロップします...
 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.

D.22 QUERY ODBC

構文
形式 1
>>--EXEC SQL--QUERY ODBC--.-COLUMN--.--------------------->
                          +-COLUMNS-+
  
 >--.--------------------------.--.------------------.---->
    +-QUALIFIER qualifier_name-+  +-OWNER owner_name-+
  
 >--.----------------------.--.------------------------.-->
    +-TABLENAME table_name-+  +-COLUMNNAME column_name-+
  
 >--END-EXEC--><
形式 2
>>--EXEC SQL--QUERY ODBC--.-DATATYPE--.------------------->
                          +-DATATYPES-+

 >--.--------------------------.--END-EXEC-->< 
    +-TYPE--.-datatype_name--.-+ 
            +-BIGINT---------+ 
            +-BINARY---------+ 
            +-BIT------------+ 
            +-CHAR-----------+ 
            +-DATE-----------+ 
            +-DECIMAL--------+ 
            +-DOUBLE---------+ 
            +-FLOAT----------+ 
            +-INTEGER--------+ 
            +-LONG VARBINARY-+ 
            +-LONG VARCHAR---+ 
            +-NUMERIC--------+ 
            +-REAL-----------+ 
            +-SMALLINT-------+ 
            +-TIME-----------+ 
            +-TIMESTAMP------+ 
            +-TINYINT--------+ 
            +-VARBINARY------+ 
            +-VARCHAR--------+ 
形式 3
>>--EXEC SQL--QUERY ODBC--.-TABLE--.---------------------->
                          +-TABLES-+
  
 >--.--------------------------.--.------------------.---->
    +-QUALIFIER qualifier_name-+  +-OWNER owner_name-+ 
  
 >--.----------------------.--.------------------------.-->
    +-TABLENAME table_name-+  +-TYPE tabletype_name----+ 
  
 >--END-EXEC-->< 
パラメータ
qualifier_name テーブルの選択に使用される修飾子を指定するホスト変数、識別子、またはリテラルを指定します。 すべての ODBC ドライバが修飾子をサポートしているわけではないので、その指定内容が異なります。 たとえば、データソースにより、複数のデータベースがサポートされている場合は、修飾子を使って使用するデータベースを指定できます。また、ファイルベースのデータソースにアクセスできる ドライバの場合は、修飾子を使って検索対象となる特定のディレクトリを指定できます。
owner_name テーブルの選択に使用するテーブル所有者を指定するホスト変数、識別子、またはリテラルを指定します。すべての ODBC ドライバがテーブル所有権をサポートしているわけではありません。
table_name クエリーに含めるテーブルを指定するホスト変数、識別子、またはリテラルを指定します。
datatype_name 照会対象となるデータ型を指定するホスト変数、識別子、またはリテラルを指定します。
tabletype_name クエリに含めるテーブルタイプのリストを指定するホスト変数、識別子、またはリテラルを指定します。
コメント

QUERY ODBC 文は、SELECT 文と同様に結果セットを送出します。したがって、 この文は、DECLARE と OPEN、または DECLARE、PREPARE と OPEN を使用してカーソルに関連付ける必要があります。

検索パターンは、SQL 識別子に有効な文字と、任意の 1 文字に一致するアンダースコア (_)、 任意の文字列に一致するパーセント記号 (%)、または、パターン内でアンダースコアまたはパーセント記号がワイルドカードではなく、 文字そのものを意味するドライバ定義のエスケープ文字の組み合わせで構成されます。

検索パターンパラメータが指定されていない場合は、関連する辞書項目すべてに一致する % のパターンが使用されます。

テーブルのクエリーには、次の規則が適用されます。

列クエリーの結果セット

列クエリーの結果セットは、次のとおりです。

TABLE_QUALIFIER
VARCHAR(128)

TABLE_OWNER
VARCHAR(128)

TABLE_NAME
VARCHAR(128) NOT NULL

COLUMN_NAME
VARCHAR(128) NOT NULL

DATA_TYPE
SMALLINT NOT NULL
OBDC データ型コードを表す定数については、odbcext.cpy および odbc.cpy を参照
TYPE_NAME
VARCHAR(128) NOT NULL
列のデータ型のドライバ従属名
PRECISION
INTEGER

LENGTH
INTEGER
列の値の固有表現に必要なメモリのサイズ
SCALE
SMALLINT

RADIX
SMALLINT
数字型の列の場合、データ型に応じて 10 または 2 (それ以外の場合は NULL)
NULLABLE
SMALLINT NOT NULL

REMARKS
VARCHAR(254)

データ型のクエリーの結果セット

データ型のクエリーの結果セットは、次のとおりです。

TYPE_NAME
VARCHAR(128) NOT NULL
列のデータ型のドライバ従属名
DATA_TYPE
SMALLINT NOT NULL
OBDC データ型コードを表す定数については、odbcext.cpy および odbc.cpy を参照
PRECISION
INTEGER
この型の列の最大精度
LITERAL_PREFIX
VARCHAR(128)
この型の接頭部リテラル値に必要な文字数
LITERAL_SUFFIX
VARCHAR(128)
この型の接尾部リテラル値に必要な文字数
CREATE_PARAMS
VARCHAR(128)
この型の列の作成時に必要なパラメータ (十進数型の場合は precision,scale など)
NULLABLE
SMALLINT NOT NULL

CASE_SENSITIVE
SMALLINT NOT NULL
文字データ型の比較における大文字と小文字の区別の有無
SEARCHABLE
SMALLINT NOT NULL
SQL_UNSEARCHABLE、SQL_LIKE_ONLY、または SQL_ALL_EXCEPT_LIKE (odbc_cpy に定義される)
UNSIGNED_ATTRIBUTE
SMALLINT
数値型の場合における符号の有無
MONEY
SMALLINT NOT NULL
数値型の場合における金額型のデータ型の指定
AUTO_INCREMENT
SMALLINT
データ型の自動増加の指定
LOCAL_TYPE_NAME
VARCHAR(128)
データ型の名前の各国語バージョン
MINIMUM_SCALE
SMALLINT

MAXIMUM_SCALE
SMALLINT

テーブルのクエリーの結果セット

テーブルのクエリーの結果セットは、次のとおりです。

TABLE_QUALIFIER
VARCHAR(128)

TABLE_OWNER
VARCHAR(128)

TABLE_NAME
VARCHAR(128)

TABLE_TYPE
VARCHAR(128)
TABLE、VIEW、SYSTEM TABLE、GLOBAL TEMPORARY、 LOCAL TEMPORARY、ALIAS、SYNONYM、またはデータソース固有の型識別子のいずれか 1 つ
REMARKS
VARCHAR(254)

EXEC SQL
   DECLARE tcurs CURSOR FOR QUERY ODBC TABLES
END-EXEC

EXEC SQL DECLARE C1 CURSOR FOR
   QUERY ODBC TABLES OWNER :tab-owner TABLETYPE 'TABLE,VIEW'
END-EXEC

MOVE 'staff' to tab-name
EXEC SQL DECLARE C2 CURSOR FOR
   QUERY ODBC COLUMNS TABLENAME :tab-name
END-EXEC

EXEC SQL DECLARE C3 CURSOR FOR
   QUERY ODBC DATATYPES
END-EXEC

D.23 ROLLBACK

構文
>>--EXEC SQL--ROLLBACK--.-WORK---------.-------------->
                        +-TRAN---------+  
                        +-TRANSACTION--+
  
>--.-----------.--END-EXEC--><  
   +--RELEASE--+
コメント

ROLLBACK 文により、現在の接続における現在のトランザクションによってデータベースに対して行われる変更が取り消されます。

RELEASE を指定し、トランザクションが正常にロールバックした場合は、現在の接続が切断されます。

EXEC SQL
    ROLLBACK
END-EXEC

EXEC SQL
    ROLLBACK WORK RELEASE
END-EXEC

D.24 SELECT DISTINCT (DECLARE CURSOR 使用)

構文
>>--EXEC SQL--.------------.--DECLARE cursor_name--------->
              +-AT db_name-+
  
 >--CURSOR FOR--SELECT DISTINCT--select_list-------------->
  
 >--FROM--table_list--.----------------.--END-EXEC--><
                      +-select_options-+
パラメータ
db_name DECLARE DATABASE を使用して宣言されているデータベースの名前を指定します。
cursor_name 以後の文でカーソルを示すために使用するカーソル名を指定します。 カーソル名には、有効なファイル名の文字を 30 字まで含めることができます。 最初の文字は数字以外の文字にする必要があります。
select_list 検索する列の名前を指定します。
table_list select_list で指定した検索対象となる列を含むテーブルの名前を指定します。
select_options 検索される行数の制限および/または検索される行の順序に指定されるオプションを指定します。
コメント

DECLARE CURSOR 文により、カーソル名が SELECT DISTINCT 文に関連付けられ、FETCH 文を使用してデータ行を検索できるようになります。

別々にコンパイルされたプログラムでは、同じカーソルを共有できません。特定のカーソルを参照する文はすべて、同時にコンパイルする必要があります。

SELECT DISTINCT 文は、カーソルが開いたときに実行されます。SELECT DISTINCT 文には、次の規則が適用されます。


備考 行セットにある重複行を削除するには、SELECT INTO ではなく SELECT DISTINCT を使用します。


01 age-array        pic s9(09) comp-5      occurs 10 times.
01 lname-array      pic x(32)              occurs 10 times.

MOVE 5 TO staff-id
EXEC SQL
   SELECT DISTINCT last_name
      INTO :lname-array
      FROM staff
      WHERE staff_id > :staff-id
END-EXEC

EXEC SQL
   SELECT DISTINCT age
      INTO :age-array
      FROM staff
      WHERE first_name > 'George'
END-EXEC

D.25 SELECT INTO

構文
>>--EXEC SQL--.-------------------.--.------------.--->
              +-FOR :host_integer-+  +-AT db_name-+
					
                                  +-- ,-+
                                  v     |
 >--SELECT--.-------------.--INTO--:hvar-------------->
            +-select_list-+ 
  
 >--select_options--END-EXEC--><
パラメータ
:host_integer 処理されるホスト配列要素の最大数を指定するホスト変数を指定します。PIC S9(4) COMP-5 で宣言する必要があります。
db_name DECLARE DATABASE を使用して宣言されているデータベースの名前を指定します。
select_list データを検索するテーブル部分を指定します。
:hvar select_list 項目を受け取る 1 つ以上のホスト変数を指定します。
select_options SQL SELECT 文 (たとえば、FROM 句または WHERE 句) で使用できる 1 つ以上の文または他のオプションを指定します。
コメント

単選択文、SELECT には、FROM を含める必要があります。

SELECT INTO 文により、結果の 1 行が検索され、select_list の項目の値が INTO リストで指定されたホスト変数に割り当てられます。 受け取るホスト変数の数よりも多く列を選択した場合、SQLWARN3 の値は 'W' に設定されます。ホスト変数のデータ型と長さは、 それに割り当てられた値と互換性がなければなりません。データが切り捨てられた場合、SQLWARN1 の値は 'W' に設定されます。

SELECT INTO 文がデータベースから複数の行を返す場合、最初の行以外の行はすべて廃棄され、 SQLWARN4 は 'W' に設定されます。最初の行以降の行も返す場合には、カーソルを使用します。 あるいは、INTO 句で配列項目を指定します。配列は、配列の最大数、 host_integer の値、返される行数のうちの最小の値まで書き込むことができます。

ANSI92ENTRY が設定され、単選択文 SELECT により複数の行が検索される場合は、SQLCODE が -1、SQLSTATE が 21000、SQLWARN4 が W になります。ANSI92ENTRY が設定されていない場合は、エラー条件または警告条件は設定されません。


備考 INTO 句のホスト変数のいずれか 1 つが配列の場合には、ホスト変数をすべて配列にする必要があります。


…
MOVE 99 TO staff-id
EXEC SQL
   SELECT last_name
      INTO :lname
      FROM staff
      WHERE staff_id=:staff-id
END-EXEC

EXEC SQL
   SELECT staff_id
      INTO :staff-id
      FROM staff
      WHERE first_name = 'Phil'
END-EXEC

D.26 SET AUTOCOMMIT

構文
>>--EXEC SQL--SET AUTOCOMMIT--.-ON--.--END-EXEC--><
                              +-OFF-+
パラメータ
ON AUTOCOMMIT モードに変更します。この変更により、各 SQL 文が分割トランザクションとして処理され、実行直後に COMMIT されます。
OFF AUTOCOMMIT モードを無効にします。使用している ODBC ドライバでトランザクションがサポートされている場合、 文をトランザクションの一部として明示的に COMMIT (またはロールバック)する必要があります。
コメント

SET AUTOCOMMIT 文により、ランタイム時に ODBC の AUTOCOMMIT モードを制御できます。これは、AUTOCOMMIT モードで CREATE、DROP などの DDL 文のみを実行できるデータソースに有効です。 この文は、AUTOCOMMIT SQL コンパイラ指令に優先されます。

EXEC SQL SET AUTOCOMMIT ON END-EXEC

D.27 SET CONCURRENCY


備考


構文
>>--EXEC SQL--SET CONCURRENCY--.-READONLY-.--END-EXEC--><
                               +-LOCKCC---+
                               +-OPTCC----+
                               +-OPTCCVAL-+ 
パラメータ
READONLY 読み込み専用のカーソルを指定します。データは変更できません。
LOCKCC 各行がフェッチされるときにその行を含むデータページに更新目的ロックを設定します。 開いたトランザクション内ではない場合は、FETCH 文が次回に実行されるときにロックが解除されます。 開いたトランザクション内の場合は、トランザクションを閉じたときにロックが解除されます。
OPTCC タイムスタンプまたは値を使用した楽観的同時性制御を指定します。 カーソルによる行の変更は、前回の FETCH 文の実行から行が変更されていない状態に限り正常に行われます。 タイムスタンプの比較による、またはタイムスタンプが使用できない場合には、テキスト、イメージ以外のすべての値の比較による値の検出が行われます。
OPTCCVAL 値を使用した楽観的同時性制御を指定します。カーソルによる行の変更は、 前回の FETCH 文の実行から行が変更されていない状態に限り正常に行われます。テキスト、イメージ以外のすべての値の比較による値の検出が行われます。
コメント

SET CONCURRENCY 文により、カーソルの同時性オプションが設定されます。

次の場合を除いて、デフォルトは LOCKCC です。

ODBC ドライバでサポートされていないオプションを設定した場合は、エラー (-19512) が発生します。


備考 Microsoft Access ドライバを使用している場合は、 CONCURRENCY はデフォルトで READONLY に設定されます。Microsoft Access で更新可能なカーソルを使用する場合は、 最初に SCROLLOPTION を KEYSET に設定してから、CONCURRENCY を LOCKCC に設定する必要があります。


OPTCC または OPTCCVAL オプションを使用しており、UPDATE WHERE CURRENT OF 文が、前回の FETCH 文の実行から行が変更されている場合は、SQLCODE の値 -532 (SQLSTATE = "01001") で失敗する可能性があります。 使用しているアプリケーションにこの状況を対処するコードを含める必要があります。

EXEC SQL SET CONCURRENCY READONLY END-EXEC

D.28 SET CONNECTION

構文
>>--EXEC SQL--SET CONNECTION--.-name----.--END-EXEC--><
                              +-DEFAULT-+ 
パラメータ
name データベース接続の名前を指定します。前の CONNECT 文で指定された接続名と一致している必要があります。 この名前は、接続のリテラル名または文字値を含むホスト変数の名前のいずれかにすることができます。
DEFAULT CONNECT 文を使用して接続名を省略して接続を確立した場合は、 確立した接続を DEFAULT にすることができます。
コメント

SET CONNECTION 文により、名前が付けられている接続が現在の接続になります。


備考 コンパイルモジュールを介して接続している場合には、名前が付けられている接続を使用する必要があります。


 EXEC SQL 
     CONNECT TO "srv1" AS server1 USER "sa." 
 END-EXEC

 EXEC SQL 
     CONNECT TO "srv2" AS server2 USER "sa." 
 END-EXEC
  
* server2 が現在の接続です
 EXEC SQL CREATE TABLE phil1
    (charbit    CHAR(5))
 END-EXEC

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

 EXEC SQL INSERT INTO phil1 VALUES('hello') END-EXEC
 IF SQLCODE NOT = ZERO
    DISPLAY 'Error: Could not insert data.'
    DISPLAY SQLERRMC
    DISPLAY SQLERRML
    EXEC SQL DISCONNECT ALL END-EXEC
    STOP RUN
 END-IF

* 現在の接続を server1 に設定します
 EXEC SQL SET CONNECTION server1 END-EXEC
 EXEC SQL
    SELECT first_name
    INTO :fname
    FROM staff
    WHERE staff_id = 10
 END-EXEC

 DISPLAY fname ' says ' WITH NO ADVANCING

* 現在の接続を server2 に設定します
 EXEC SQL SET CONNECTION server2 END-EXEC
 EXEC SQL
    SELECT charbit
    INTO :fname
    WHERE charbit = 'hello'
    FROM phil1
 END-EXEC

 DISPLAY fname

 EXEC SQL DISCONNECT server1 END-EXEC
 EXEC SQL DISCONNECT server2 END-EXEC

 STOP RUN

D.29 SET OPTION


備考 SET OPTION 文は、すべての ODBC ドライバでサポートされているわけではありません。


構文
>>--EXEC SQL--SET OPTION--.-QUERYTIME---.-->
                          +-LOGINTIME---+
                          +-APPLICATION-+
                          +-HOST--------+ 
  
 >--value--END-EXEC-->< 
パラメータ
value リテラルまたはホスト変数の名前を指定します。ホスト変数には、 アプリケーションの場合は文字値、LOGINTIME または QUERYTIME の場合は数値を含める必要があります。
QUERYTIME OpenESQL 文に応答するプログラムの待機時間の秒数を設定します。 デフォルトは 0 秒です (応答があるまで待機)。このオプションは、既存のネットワークのタイムアウト設定には優先されません。
LOGINTIME CONNECT TO 文に応答するプログラムの待機時間の秒数を設定します。 デフォルトは 10 秒です。0 の場合のタイムアウト時間は無制限です。
APPLICATION CONNECT TO 文の実行時に OpenESQL によってデータソースに渡されるアプリケーション名を設定します。
HOST CONNECT TO 文の実行時に OpenESQL によってデータソースに渡されるホストワークステーション名を設定します。
 EXEC SQL SET OPTION logintime 5 END-EXEC
 EXEC SQL CONNECT TO "srv2" USER "sa." END-EXEC
* CONNECT 文が 5 秒以内にサーバ "srv2" にログインしない場合は
* タイムアウトして
* プログラムに返されます
 EXEC SQL SET OPTION querytime 2 END-EXEC
 EXEC SQL SELECT name FROM sysobjects INTO :name END-EXEC
* SELECT 文が 2 秒以内に応答しない場合は
* クエリーはタイムアウトしてプログラムに返されます

D.30 SET SCROLLOPTION


備考


構文
>>--EXEC SQL--SET SCROLLOPTION--.-KEYSET----.--END-EXEC-><
                                +-DYNAMIC---+
                                +-FORWARD---+
                                +-STATIC----+
パラメータ
KEYSET キーセットカーソルでは、カーソルの結果セットにある行のメンバーシップと順序は、カーソルが開いたときに決定されます。行を削除する場合、または WHERE 句の条件を満たさないように行を更新する場合は、行がフェッチされません。 1 つのテーブルに基づいたカーソルを使って行が挿入された場合に限り、 カーソルの結果セットに行が表示されます。結果セットの任意の行に対して行われた、カーソルの所有者による更新、および他のユーザによって COMMIT された変更は表示可能です。
DYNAMIC 動的カーソルでは、カーソルの結果セットにある行のメンバーシップは、フェッチ時に決定されます。 このメンバーシップは、各フェッチ間で変更できます。行を削除する場合、または WHERE 句の条件を満たさないように行を更新する場合は、 行がカーソルの結果セットから消去されます。行を挿入する場合、または WHERE 句の条件を満たすように更新する場合は、 行が結果セットに表示されます。結果セットに対して行われた、カーソル所有者による更新、および他のユーザによって COMMIT された変更は表示可能です。
FORWARD DYNAMIC と同じですが、アプリケーションでは結果セットの前方移動のみに使用できます。
STATIC 静的カーソルでは、結果セットは静的になります。カーソルを開いた後に行われたメンバーシップ、結果セットの順序または値の変更は、つねに検出されるとは限りません。

次の場合を除いて、デフォルトは DYNAMIC です。

ODBC ドライバでサポートされていないオプションを設定した場合は、エラー (-19512) が発生します。

PROGRAM-ID. progname.

WORKING-STORAGE SECTION.
   EXEC SQL INCLUDE SQLCA END-EXEC
   01      buffer      PIC x(32).
   01      cnt         PIC 9 COMP-5.

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 SQLERRML
   END-IF

* 宣言されたすべてのカーソルは今後動的に更新することができます
 EXEC SQL SET SCROLLOPTION DYNAMIC END-EXEC
    IF SQLCODE NOT = ZERO
       DISPLAY 'Error: Could not set scroll option.'
       DISPLAY SQLERRMC
       DISPLAY SQLERRML
       EXEC SQL DISCONNECT ALL END-EXEC
       STOP RUN
    END-IF

* 複数のテーブルが作成されないようにします...
 EXEC SQL DROP TABLE phil1 END-EXEC

* テーブルを作成します...
 EXEC SQL
    CREATE TABLE phil1
	 (ident      char(3)
	 ,textbit    char(3))
 END-EXEC
 IF SQLCODE NOT = ZERO
    DISPLAY 'Error: Could not create table.'
    DISPLAY SQLERRMC
    DISPLAY SQLERRML
    EXEC SQL DISCONNECT ALL END-EXEC
    STOP RUN
 END-IF

* テーブルに値を挿入します...
 EXEC SQL
    INSERT INTO phil1
	(ident
	,textbit)
    VALUES
	('AAA'
	,'BBB')
 END-EXEC
 IF SQLCODE NOT = ZERO
    DISPLAY 'Error: Could not insert values.'
    DISPLAY SQLERRMC
    DISPLAY SQLERRML
    EXEC SQL DISCONNECT ALL END-EXEC
    STOP RUN
 END-IF

 EXEC SQL
    INSERT INTO phil1
	(ident
        ,textbit)
    VALUES
	('CCC'
	,'---')
 END-EXEC
 IF SQLCODE NOT = ZERO
    DISPLAY 'Error: Could not insert values.'
    DISPLAY SQLERRMC
    DISPLAY SQLERRML
    EXEC SQL DISCONNECT ALL END-EXEC
    STOP RUN
 END-IF

* カーソルを宣言します...
 EXEC SQL
    DECLARE C1 CURSOR FOR
       SELECT ident
       FROM phil1
       WHERE textbit = 'BBB'
 END-EXEC
 IF SQLCODE NOT = ZERO
    DISPLAY 'Error: Could not declare cursor.'
    DISPLAY SQLERRMC
    DISPLAY SQLERRML
    EXEC SQL DISCONNECT ALL END-EXEC
    STOP RUN
 END-IF

* カーソルを開きます...
 EXEC SQL
    OPEN C1
 END-EXEC
 IF SQLCODE NOT = ZERO
    DISPLAY 'Error: Could not open cursor.'
    DISPLAY SQLERRMC
    DISPLAY SQLERRML
    EXEC SQL DISCONNECT ALL END-EXEC
    STOP RUN
 END-IF

* カーソルの要件に合うよう
* テーブル内の行の 1 つを更新します...
 EXEC SQL
    UPDATE phil1
    SET textbit = 'BBB'
    WHERE ident = 'CCC'
 END-EXEC
 IF SQLCODE NOT = ZERO
    DISPLAY 'Error: Could not update row.'
    DISPLAY SQLERRMC
    DISPLAY SQLERRML
    EXEC SQL DISCONNECT ALL END-EXEC
    STOP RUN
 END-IF

* カーソルが開いたあとのカーソル要件に合うように行が更新されても、
* SET SCROLLOPTION DYNAMIC は
* カーソルによって示されるようにする必要があります。
* 表示された出力を確認するためにチェックします...

 MOVE 0 TO cnt
 PERFORM UNTIL SQLCODE NOT = ZERO
    EXEC SQL
       FETCH C1 INTO :buffer
    END-EXEC
    IF SQLCODE = ZERO
       DISPLAY buffer
    END-IF
 END-PERFORM

 EXEC SQL
    CLOSE C1
 END-EXEC
 IF SQLCODE NOT = ZERO
    DISPLAY 'Error: Could not close cursor.'
    DISPLAY SQLERRMC
    DISPLAY SQLERRML
    EXEC SQL DISCONNECT ALL END-EXEC
    STOP RUN
 END-IF

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

 EXEC SQL DISCONNECT CURRENT END-EXEC

 STOP RUN.

D.31 SET TRANSACTION ISOLATION

構文
>>--EXEC SQL--SET TRANSACTION ISOLATION--------------->

 >--.-READ UNCOMMITTED-.--END-EXEC--><
    +-READ COMMITTED---+
    +-REPEATABLE READ--+
    +-SERIALIZABLE-----+
パラメータ

SET TRANSACTION ISOLATION 文により、現在の接続のトランザクション分離レベルが ODBC によって指定された分離レベルモードのいずれか 1 つに設定されます。

トランザクション分離レベルの設定に応じて、トランザクションは次のように相互に作用することができます。

これらの条件は、ロックで制御できます。ロックとは、トランザクションが他のトランザクションの完了まで待機する必要がある、つまり同時性を制限する (消極的同時性とも呼ばれる) こと、またはその状況が発生した場合にトランザクションを強制的にロールバックする、つまり同時性の影響を少なくした上で作業を強制的に繰り返す (楽観的同時性とも呼ばれる) ことを意味します。

READ UNCOMMITED モードでは、ダーティー読み出し、繰り返し不可読み出し、およびファントムがすべて可能です。

READ COMMITED モードでは、ダーティー読み出しは不可能ですが、繰り返し不可読み出しおよびファントムは可能です。

REPEATABLE READ モードでは、ダーティー読み出しおよび繰り返し不可読み出しは不可能ですが、ファントムは可能です。

SERIALIZABLE では、ダーティー読み出し、繰り返し不可読み出し、およびファントムがすべて可能です。


備考

ドライバによっては、ODBC によって定義される分離レベルがすべてサポートされているわけではありません。 ドライバでサポートされていないモードを設定する場合は、それに応じて SQLCODE および SQLSTATE を設定します。


EXEC SQL SET TRANSACTION ISOLATION READ UNCOMMITTED END-EXEC

D.32 UPDATE (位置付け)

構文
>>--EXEC SQL--.----------------.--.------------.------>
              +-FOR :row_count-+  +-AT db_name-+
 
                             +----- ,----------+
                             v                 |
 >--UPDATE--table_name--SET---column=expression-------> 
 
 >--WHERE CURRENT OF--cursor_name--END-EXEC-->< 
パラメータ
:row_count 整数型のホスト変数を指定します。結果およびパラメータのホスト変数がすべて同じサイズの配列で、 すべての要素を使用するわけではない場合には、使用する行数を指定します。UPDATE が DECLARE CURSOR 文の一部である場合は、FOR 句を使用することはできません。
db_name DECLARE DATABASE を使用して宣言されているデータベースの名前を指定します。
table_name 更新するテーブルを指定します。
column=expression 特定の列名の値を指定します。この値には式または NULL 値が使用できます。
cursor_name 前に宣言された開いているフェッチされたカーソルを指定します。
コメント

ODBC では位置付け更新がサポートされます。位置付け更新は、拡張構文でカーソルを使って最後にフェッチされた行を更新します (ODBC 1.0 では主要構文で更新されていましたが、ODBC 2.0では拡張構文に移行しました)。 すべてのドライバが位置付け更新をサポートしているわけではありません。ただし、OpenESQL では、位置付け更新および位置付け削除が容易にできるように、ODBC カーソル名を COBOL カーソル名と同じ名前に設定します。

ODBC ドライバによっては、カーソルによって使用される SELECT 文には、位置付け更新を可能にするために FOR UPDATE 句を含める必要があります。

標準 SQL 文で使用される UPDATE のもう 1 つの形式は、検索更新と呼ばれます。

位置付け更新ではホスト配列を使用できません。

ほとんどのデータソースには、SET 文によって指定される、または DECLARE CURSOR 文で指定される SCROLLOPTION と CONCURRENCY の特定の組み合わせが必要です。

ODBC カーソルのライブラリにより、位置付け更新の制限付き実装が提供されます。 SQL(USECURLIB=YES) でコンパイルし、SCROLLOPTION STATIC および CONCURRENCY OPTCCVAL (または OPTIMISTIC) を使用することによって、その更新を行うことができます。

EXEC SQL CONNECT TO 'srv1' USER 'sa' END-EXEC

EXEC SQL DECLARE C1 CURSOR FOR
   SELECT last_name, first_name
   FROM staff
   FOR UPDATE
END-EXEC         

EXEC SQL
   OPEN C1
END-EXEC

PERFORM UNTIL SQLCODE NOT = ZERO
   EXEC SQL
      FETCH C1 INTO :fname,:lname
   END-EXEC
   IF SQLCODE = ZERO
      DISPLAY fname " " lname
      DISPLAY "Update?" 
      ACCEPT reply
      IF reply = "y"
         DISPLAY "New last name?" 
         ACCEPT lname
         EXEC SQL
            UPDATE staff 
            SET last_name=:lname WHERE CURRENT OF c1
         END-EXEC
         DISPLAY "update sqlcode=" SQLCODE
      END-IF
   END-IF
END-PERFORM

EXEC SQL DISCONNECT ALL END-EXEC
STOP RUN.

D.33 UPDATE (検索)

構文
>>--EXEC SQL-.-------------------.--.------------.---->
             +-FOR :host_integer-+  +-AT db_name-+
  
                                +---- ,-----------+
                                v                 |
 >--UPDATE-.-table_name-.--SET---column=expression---->
           +-view_name--+
  
 >--.-------------------------.--END-EXEC--><
    +-WHERE search_conditions-+
パラメータ
:host_integer 処理されるホスト配列要素の最大数を指定するホスト変数を指定します。 PIC S9(4) COMP-5 で宣言する必要があります。
db_name DECLARE DATABASE を使用して宣言されているデータベースの名前を指定します。
table_name 更新するテーブルを指定します。
view_name 更新するビューを指定します。
column=expression 特定の列名の値を指定します。この値には式または NULL 値が使用できます。
search_conditions 標準 SQL の WHERE 句の後に続く任意の有効な式を指定します。
コメント

UPDATE は、ODBC ドライバに直接渡される標準 SQL 文です。 構文の詳細については、使用している ODBC ドライバに付属しているマニュアルを参照してください。

WHERE 句を指定しない場合は、名前が付けられたテーブルの行すべてが更新されます。

WHERE 句または SET 句で使用されるホスト変数のいずれか 1 つが配列の場合には、ホスト変数をすべて配列にする必要があります。

EXEC SQL
   UPDATE staff
   SET first_name = 'Jonathan'
   WHERE staff_id = 1
END-EXEC

MOVE 'Phil' TO NewName
MOVE 1 TO targetID
EXEC SQL
   UPDATE staff
   SET first_name = :NewName
   WHERE staff_id  = :targetID
END-EXEC

D.34 WHENEVER

構文
>>--EXEC SQL--WHENEVER--.-NOT FOUND--.---------------->
                        +-SQLERROR---+
                        +-SQLWARNING-+ 
  
 >--.-CONTINUE--------.--END-EXEC--><
    +-PERFORM label---+
    +-GOTO stmt_label-+ 
パラメータ
CONTINUE ソースプログラムの次の文を実行します。
PERFORM label 特定のエラーレベルが検出されたときに実行されるコードの段落または節を識別します。
GOTO stmt_label 特定のエラーレベルが検出されたときに制御するプログラムの場所を識別します。
コメント

WHENEVER 文により、NOT FOUND、SQLERROR、SQLWARNING の各条件に応じて埋め込み SQL 文を実行した後に、デフォルトアクションが指定されます。

条件
SQLCODE
エラーなし
0
NOT FOUND
100
SQLWARNING
+1
SQLERROR
< 0 (負)

WHENEVER 文の範囲は、実行順序ではなく、ソースプログラムの文の位置に関係します。デフォルトは、3 つの条件すべてに対して CONTINUE です。

EXEC SQL WHENEVER sqlerror PERFORM errormessage1 END-EXEC

EXEC SQL 
   DELETE FROM staff
   WHERE staff_id = 'hello' 
END-EXEC

EXEC SQL 
   DELETE FROM students
   WHERE student_id = 'hello'
END-EXEC

EXEC SQL WHENEVER sqlerror CONTINUE END-EXEC

EXEC SQL 
   INSERT INTO staff VALUES ('hello')
END-EXEC

DISPLAY 'Sql Code is: ' SQLCODE

EXEC SQL WHENEVER sqlerror PERFORM errormessage2 END-EXEC

EXEC SQL 
   INSERT INTO staff VALUES ('hello again') 
END-EXEC

STOP RUN.

errormessage1 SECTION.
   display "SQL DELETE error: " sqlcode
   EXIT.

errormessage2 SECTION.
   display "SQL INSERT error: " sqlcode
   EXIT.


Copyright © 2002 Micro Focus International Limited. All rights reserved.
本書ならびに使用されている固有の商標と商品名 は国際法で保護されています。

前へDataDirect ODBC ドライバ CP プリプロセッサ次へ