![]() | DataDirect ODBC ドライバ | CP プリプロセッサ | ![]() |
>>---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
>>--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
>>--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
>>--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
>>--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.'
>>--EXEC SQL--CONNECT TO--.-------------.---------------> +-data_source-+ >--.------------.--USER--.------------------.----------> +-AS db_name-+ +-user-.-----------+ +-.password-+ >--.--------------------.------------------------------> +-WITH-.----.-PROMPT-+ +-NO-+ >--.-----------------------------.--END-EXEC-->< +-RETURNING output_connection-+
>>--EXEC SQL--CONNECT user--.------------------------.--> +-IDENTIFIED BY password-+ +-------"/"password------+ >--.--------------.--.--------------------.------------> +--AT db_name--+ +--USING data_source-+ >--.--------------------.------------------------------> +-WITH-.----.-PROMPT-+ +-NO-+ >--.-----------------------------.--END-EXEC-->< +-RETURNING output_connection-+
>>--EXEC SQL--CONNECT WITH PROMPT----------------------> >--.-----------------------------.--END-EXEC-->< +-RETURNING output_connection-+
>>--EXEC SQL--CONNECT RESET-.------.--END-EXEC-->< +-name-+
>>--EXEC SQL--CONNECT DSN input_connection------------> >--.-----------------------------.--END-EXEC-->< +-RETURNING output_connection-+
>>--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 スプレッドシートに接続します。
>>--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
>>--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 を使用することはできません。
>>--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
>>--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
>>--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
>>--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.
>>--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
>>--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
>>--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
>>--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
>>--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
>>--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
>>--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
>>--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
>>--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.
>>--EXEC SQL--QUERY ODBC--.-COLUMN--.---------------------> +-COLUMNS-+ >--.--------------------------.--.------------------.----> +-QUALIFIER qualifier_name-+ +-OWNER owner_name-+ >--.----------------------.--.------------------------.--> +-TABLENAME table_name-+ +-COLUMNNAME column_name-+ >--END-EXEC--><
>>--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--------+
>>--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
>>--EXEC SQL--ROLLBACK--.-WORK---------.--------------> +-TRAN---------+ +-TRANSACTION--+ >--.-----------.--END-EXEC-->< +--RELEASE--+
ROLLBACK 文により、現在の接続における現在のトランザクションによってデータベースに対して行われる変更が取り消されます。
RELEASE を指定し、トランザクションが正常にロールバックした場合は、現在の接続が切断されます。
EXEC SQL ROLLBACK END-EXEC EXEC SQL ROLLBACK WORK RELEASE END-EXEC
>>--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
>>--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
>>--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
備考
>>--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
>>--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
備考 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 秒以内に応答しない場合は * クエリーはタイムアウトしてプログラムに返されます
備考
>>--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.
>>--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
>>--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.
>>--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
>>--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 プリプロセッサ | ![]() |