埋め込みSQL文を使って,データベースの表にアクセスする例を示します。表は,DBMSが提供するツールなどを使用して定義します。詳細は,使用するDBMSのSQLリファレンスなどを参照してください。
なお,ここに示すのは,HiRDBを使用した場合のアクセス方法の例です。
氏名と住所にそれぞれ対応する,PERSONNAME列とPERSONADDRESS列を持つ「ADDRESSBOOK」という住所録の表を定義します。
CREATE TABLE ADDRESSBOOK ( PERSONNAME char(20),
PERSONADDRESS varchar(255))
「ADDRESSBOOK」の表にアクセスします。
すでに表へ登録されている人の場合,住所を更新します。また,登録されていない人の場合,住所と氏名を新規に登録します。
* <埋め込みSQL宣言節>
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
01 ODBC-DSN PIC X(10) VALUE 'SAMPLE'.
01 ODBC-UID PIC X(10) VALUE 'USER1'.
01 ODBC-PWD PIC X(10) VALUE 'USER1'.
01 行数 PIC S9(9) USAGE COMP VALUE ZERO.
01 ADDRESSBOOK.
02 PERSONNAME PIC X(20).
02 PERSONADDRESS.
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 PERSONNAME.
MOVE '福岡市博多区1丁目' TO ODBC-char OF PERSONADDRESS.
MOVE 27 TO ODBC-length OF PERSONADDRESS.
EXEC SQL
SELECT COUNT(*) INTO :行数 FROM ADDRESSBOOK
WHERE PERSONNAME = :PERSONNAME
END-EXEC.
* <住所録の表に登録する>
IF 行数 = 0 THEN
EXEC SQL
INSERT INTO ADDRESSBOOK ( PERSONNAME, PERSONADDRESS)
VALUES ( :PERSONNAME, :PERSONADDRESS)
END-EXEC
* <住所録の表の住所を更新する>
ELSE
EXEC SQL
UPDATE ADDRESSBOOK SET PERSONADDRESS = :PERSONADDRESS
WHERE PERSONNAME = :PERSONNAME
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) 静的に行う方法によるプログラムの例」に示した「ADDRESSBOOK」の表にアクセスします。
すでに表へ登録されている人の場合,住所を更新し,表に未登録の人の場合,住所と氏名を登録するようなストアドプロシージャを定義します。
CREATE PROCEDURE
ADDRESSUPDATE (IN @PERSONNAME char(20)
, IN @PERSONADDRESS varchar(255) )
BEGIN
DECLARE REC_CNT INTEGER;
SELECT COUNT(*) INTO REC_CNT FROM ADDRESSBOOK
WHERE PERSONNAME = @PERSONNAME;
IF 0 = REC_CNT THEN
INSERT INTO ADDRESSBOOK ( PERSONNAME,PERSONADDRESS )
VALUES ( @PERSONNAME,@PERSONADDRESS );
ELSE
UPDATE ADDRESSBOOK SET PERSONADDRESS = @PERSONADDRESS
WHERE PERSONNAME = @PERSONNAME;
END IF;
END
定義したストアドプロシージャを呼び出します。
* <埋め込みSQL宣言節>
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
:
01 ADDRESSUPDATE.
02 PERSONNAME PIC X(20).
02 PERSONADDRESS.
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 PERSONNAME.
MOVE '福岡市博多区2丁目' TO ODBC-char OF PERSONADDRESS.
MOVE 27 TO ODBC-length OF PERSONADDRESS.
EXEC SQL
CALL ADDRESSUPDATE ( :PERSONNAME, :PERSONADDRESS )
END-EXEC.
:
氏名と住所にそれぞれ対応する,PERSONNAME列とPERSONADDRESS列を持つ「ADDRESSBOOK」という住所録の表を定義します。
CREATE TABLE ADDRESSBOOK ( PERSONNAME char(20),
PERSONADDRESS varchar(255))
「ADDRESSBOOK」の表にアクセスします。
住所録の表に住所,氏名を登録し,住所録一覧を取得します。
* <埋め込みSQL宣言節>
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
:
01 動的SQL PIC X(80).
01 ADDRESSBOOK.
02 PERSONNAME PIC X(20).
02 PERSONADDRESS.
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 ADDRESSBOOK (PERSONNAME, PERSONADDRESS)
- 'VALUES (?,?)' TO 動的SQL.
EXEC SQL
PREPARE DYNSQL1 FROM :動的SQL
END-EXEC.
MOVE '日立 太郎' TO PERSONNAME.
MOVE '福岡市博多区3丁目' TO ODBC-char OF PERSONADDRESS.
MOVE 27 TO ODBC-length OF PERSONADDRESS.
EXEC SQL
EXECUTE DYNSQL1 USING :PERSONNAME, :PERSONADDRESS
END-EXEC.
EXEC SQL
DEALLOCATE PREPARE DYNSQL1
END-EXEC.
EXEC SQL
COMMIT WORK
END-EXEC.
* <住所録の表を一覧表示する>
MOVE 'SELECT PERSONNAME, PERSONADDRESS FROM ADDRESSBOOK'
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 :PERSONNAME, :PERSONADDRESS
END-EXEC.
:
EXEC SQL
CLOSE CRS00
END-EXEC.
EXEC SQL
DEALLOCATE PREPARE DYNSQL1
END-EXEC.
:
testdb1の接続先データベースの「ADDRESSBOOK」の表にアクセスし,取得した住所データでtestdb2の接続先データベースの「RECIPIENTS」の表の住所を更新します。
:
* <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 PERSONNAME.
EXEC SQL
SELECT PERSONADDRESS INTO :PERSONADDRESS FROM ADDRESSBOOK
WHERE PERSONNAME = :PERSONNAME
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 PERSONNAME.
EXEC SQL
UPDATE RECIPIENTS SET PERSONADDRESS = :PERSONADDRESS
WHERE PERSONNAME = :PERSONNAME
END-EXEC.
:
* <現行コネクション(CONNDB2)を解除>
EXEC SQL
DISCONNECT CURRENT …3.
END-EXEC.
* <現行コネクションを変更する>
EXEC SQL
SET CONNECTION CONNDB1 …4.
END-EXEC.
: