COBOL2002 ユーザーズガイド
埋め込みSQL文を使って,データベースの表にアクセスする例を示します。表は,DBMSが提供するツールなどを使用して定義します。詳細は,使用するDBMSのSQLリファレンスなどを参照してください。
なお,ここに示すのは,SQL Serverを使用した場合のアクセス方法の例です。
氏名と住所の列を持つ「住所録」という表を定義します。
CREATE TABLE 住所録 ( 氏名 char(20), 住所 varchar(255))
「住所録」の表にアクセスします。
すでに表へ登録されている人の場合,住所を更新します。また,登録されていない人の場合,住所と氏名を新規に登録します。
* <埋め込みSQL宣言節> EXEC SQL BEGIN DECLARE SECTION END-EXEC. 01 ODBC-DSN PIC X(10) VALUE 'サンプル'. 01 ODBC-UID PIC X(10) VALUE 'sa'. 01 ODBC-PWD PIC X(10) VALUE SPACE. 01 行数 PIC S9(9) USAGE COMP VALUE ZERO. 01 住所録. 02 氏名 PIC X(20). 02 住所. 03 ODBC-length PIC S9(9) USAGE COMP. 03 ODBC-char PIC X(255). EXEC SQL END DECLARE SECTION END-EXEC. : PROCEDURE DIVISION. : * <埋め込み例外宣言> EXEC SQL WHENEVER SQLERROR STOP END-EXEC. * <コネクションの確立> EXEC SQL CONNECT :ODBC-UID IDENTIFIED BY :ODBC-PWD USING :ODBC-DSN END-EXEC. * <埋め込み例外宣言> EXEC SQL WHENEVER SQLERROR GO TO :ROLLBACK-PROC END-EXEC. EXEC SQL WHENEVER NOT FOUND PERFORM :NOTFOUND-PROC END-EXEC. * <登録されているかを参照する> MOVE '日立 太郎' TO 氏名. MOVE '福岡市博多区1丁目' TO ODBC-char OF 住所. MOVE 18 TO ODBC-length OF 住所. EXEC SQL SELECT COUNT(*) INTO :行数 FROM 住所録 WHERE 氏名 = :氏名 END-EXEC. * <住所録の表に登録する> IF 行数 = 0 THEN EXEC SQL INSERT INTO 住所録 ( 氏名, 住所 ) VALUES ( :氏名, :住所 ) END-EXEC * <住所録の表の住所を更新する> ELSE EXEC SQL UPDATE 住所録 SET 住所 = :住所 WHERE 氏名 = :氏名 END-EXEC END-IF. EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC. EXEC SQL WHENEVER NOT FOUND CONTINUE END-EXEC. EXEC SQL COMMIT WORK END-EXEC. GO TO DISCONNECT-PROC. ROLLBACK-PROC. EXEC SQL ROLLBACK WORK END-EXEC. DISCONNECT-PROC. EXEC SQL DISCONNECT END-EXEC. : STOP RUN. NOTFOUND-PROC SECTION. : NOTFOUND-PROC-END. EXIT. :
「(1) 静的に行う方法によるプログラムの例」に示した「住所録」の表にアクセスします。
すでに表へ登録されている人の場合,住所を更新し,表に未登録の人の場合,住所と氏名を登録するようなストアドプロシージャを定義します。
CREATE PROCEDURE 住所更新 ( @氏名 char(20),@住所 varchar(255)) AS IF 0 = (SELECT COUNT(*) FROM 住所録 WHERE 氏名 = @氏名) BEGIN INSERT INTO 住所録( 氏名,住所 ) VALUES ( @氏名,@住所 ) END ELSE BEGIN UPDATE 住所録 SET 住所 = @住所 WHERE 氏名 = @氏名 END
定義したストアドプロシージャを呼び出します。
* <埋め込みSQL宣言節> EXEC SQL BEGIN DECLARE SECTION END-EXEC. : 01 住所更新. 02 氏名 PIC X(20). 02 住所. 03 ODBC-length PIC S9(9) USAGE COMP. 03 ODBC-char PIC X(255). EXEC SQL END DECLARE SECTION END-EXEC. : PROCEDURE DIVISION. : * <住所録の表の住所を更新する> MOVE '日立 太郎' TO 氏名. MOVE '福岡市博多区2丁目' TO ODBC-char OF 住所. MOVE 18 TO ODBC-length OF 住所. EXEC SQL CALL 住所更新 ( :氏名, :住所 ) END-EXEC. :
氏名と住所の列を持つ「住所録」という表を定義します。
CREATE TABLE 住所録 ( 氏名 char(20), 住所 varchar(255))
「住所録」の表にアクセスします。
住所録の表に住所,氏名を登録し,住所録一覧を取得します。
* <埋め込みSQL宣言節> EXEC SQL BEGIN DECLARE SECTION END-EXEC. : 01 動的SQL PIC X(80). 01 住所録. 02 氏名 PIC X(20). 02 住所. 03 ODBC-length PIC S9(9) USAGE COMP. 03 ODBC-char PIC X(255). EXEC SQL END DECLARE SECTION END-EXEC. : PROCEDURE DIVISION. : * <埋め込み例外宣言> EXEC SQL WHENEVER SQLERROR GO TO :ROLLBACK-PROC END-EXEC. EXEC SQL WHENEVER NOT FOUND PERFORM :NOTFOUND-PROC END-EXEC. * <住所録の表に登録する> MOVE 'INSERT INTO 住所録 (氏名, 住所) VALUES (?,?)' TO 動的SQL. EXEC SQL PREPARE DYNSQL1 FROM :動的SQL END-EXEC. MOVE '日立 太郎' TO 氏名. MOVE '福岡市博多区3丁目' TO ODBC-char OF 住所. MOVE 18 TO ODBC-length OF 住所. EXEC SQL EXECUTE DYNSQL1 USING :氏名, :住所 END-EXEC. EXEC SQL DEALLOCATE PREPARE DYNSQL1 END-EXEC. EXEC SQL COMMIT WORK END-EXEC. * <住所録の表を一覧表示する> MOVE 'SELECT 氏名, 住所 FROM 住所録' TO 動的SQL. EXEC SQL PREPARE DYNSQL1 FROM :動的SQL END-EXEC. EXEC SQL DECLARE CRS00 CURSOR FOR DYNSQL1 END-EXEC. EXEC SQL OPEN CRS00 END-EXEC. EXEC SQL FETCH CRS00 INTO :氏名, :住所 END-EXEC. : EXEC SQL CLOSE CRS00 END-EXEC. EXEC SQL DEALLOCATE PREPARE DYNSQL1 END-EXEC. :
testdb1の接続先データベースの「住所録」の表にアクセスし,取得した住所データでtestdb2の接続先データベースの「宛先」の表の住所を更新します。
: * <CONNDB1コネクションの確立> MOVE 'testdb1' TO ODBC-DSN. EXEC SQL CONNECT :ODBC-UID IDENTIFIED BY :ODBC-PWD …1. USING :ODBC-DSN AS CONNDB1 END-EXEC. * <住所を取得する> MOVE '日立 太郎' TO 氏名. EXEC SQL SELECT 住所 INTO :住所 FROM 住所録 WHERE 氏名 = :氏名 END-EXEC. : * <CONNDB2コネクションの確立> MOVE 'testdb2' TO ODBC-DSN. EXEC SQL CONNECT :ODBC-UID IDENTIFIED BY :ODBC-PWD …2. USING :ODBC-DSN AS CONNDB2 END-EXEC. * <取得した住所で更新する> MOVE '日立 太郎' TO 氏名. EXEC SQL UPDATE 宛先 SET 住所 = :住所 WHERE 氏名 = :氏名 END-EXEC. : * <現行コネクション(CONNDB2)を解除> EXEC SQL DISCONNECT CURRENT …3. END-EXEC. * <現行コネクションを変更する> EXEC SQL SET CONNECTION CONNDB1 …4. END-EXEC. :
All Rights Reserved. Copyright (C) 2013, 2016, Hitachi, Ltd.
All Rights Reserved. Copyright (C) 2002, 2011, Microsoft Corporation.