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.