複合文(複数文実行)
機能
複数のSQL文をまとめて,一つのSQL文(複合文)として実行します。
形式
〔開始ラベル:〕 |
オペランド
複合文の文ラベルを指定します。
複合文の開始を指定します。
複合文中で使用するSQL変数を宣言します。SQL変数が割り当てられたとき,初期値としてSQL変数の既定値が設定されます。SQL変数の既定値はDEFAULT句で指定します。DEFAULT句を省略した場合,SQL変数の既定値はナル値になります。
複合文中で使用するカーソルを宣言します。
ハンドラ宣言,SIGNAL文,又はRESIGNAL文の中で使用する条件名と,それに対応するSQLCODEの値を宣言します。
複合文中で例外処理をするためのハンドラを宣言します。
複合文中のSQL文を実行した結果のSQLCODE値,SIGNAL文,又はRESIGNAL文の条件名がハンドラ宣言で指定した条件値と一致すると,ハンドラが制御を受け取り,ハンドラ動作を実行します。
ハンドラが有効になる条件を指定します。
複合文中で実行するSQL手続き文を指定します。
複合文の終了を指定します。終了ラベルには,文ラベルを指定します。
SQLCODEの値を整数定数で指定します。
SQLCODEの値として,正常終了を表す値である0は指定できません。SQLCODE値に指定する整数定数を次の表に示します。
表7-2 SQLCODE値に指定する整数定数
SQL文の実行状態 | SQLCODEの値 |
---|---|
正常終了(警告あり) | >0(≠100,110) |
データがない | 100 |
異常終了 | <0 |
HiRDBで発生する可能性がある,SQLCODEに対応するメッセージを次の表に示します。
表7-3 HiRDBで発生する可能性がある,SQLCODEに対応するメッセージ
SQLCODE | 対応するメッセージID |
---|---|
-yyy | KFPA11yyy |
-1yyy | KFPA19yyy |
-3yyy | KFPA18yyy |
yyy | KFPA12yyy |
+3yyy | KFPA13yyy |
共通規則
AAA: BEGIN ...........................................1
DECLARE CN1 CONDITION FOR SQLCODE VALUE -800;
DECLARE EXIT HANDLER FOR CN1
AAA: BEGIN .........................................2
:
END AAA;
AAA: BEGIN .........................................3
DECLARE CN2 CONDITION FOR SQLCODE VALUE -800;
DECLARE EXIT HANDLER FOR CN2
:
END AAA;
:
END AAA
留意事項
使用例
CREATE PROCEDURE PROC1(OUT OUTDATA INT)
BEGIN
DECLARE CR1 CURSOR FOR SELECT SURYO FROM ZAIKO ;
OPEN CR1 ;
WHILE SQLCODE=0 DO
FETCH CR1 INTO OUTDATA ;
IF SQLCODE=0 THEN
IF OUTDATA>=1000 THEN
UPDATE ZAIKO SET TANKA = (1-0.3)*TANKA WHERE CURRENT OF CR1 ;
ELSE IF OUTDATA=0 THEN
DELETE FROM ZAIKO WHERE CURRENT OF CR1 ;
ELSE
UPDATE ZAIKO SET TANKA = (1-0.1)*TANKA WHERE CURRENT OF CR1 ;
END IF ;
END IF ;
END;
END
CREATE PROCEDURE PROC2(IN USCODE CHAR(4), IN USURYO INT,
OUT MSG MVARCHAR(255))
BEGIN
DECLARE PSURYO INT;
DECLARE illegal_value CONDITION ;
DECLARE EXIT HANDLER FOR illegal_value
SET MSG=M'数量として無効な値です。';
DECLARE EXIT HANDLER FOR NOT FOUND
SET MSG=M'指定された商品コードは登録されていません。';
DECLARE CONTINUE HANDLER FOR SQLCODE VALUE -210
SET MSG=M'非ナル値制約ありの列をNULL値で更新しようとしましたが,
無視します。';
SET MSG ='';
IF USURYO<0 THEN
SIGNAL illegal_value;
ELSE
UPDATE ZAIKO SET ZSURYO=USURYO WHERE ZSCODE=USCODE;
SET MSG=MSG||M'処理が完了しました。 '
SELECT ZSURYO INTO PSURYO FROM ZAIKO WHERE ZSCODE=USCODE;
SET MSG=MSG||M'現在の数量:'||NUMEDIT(PSURYO,'<999999');
END IF;
END
CREATE PROCEDURE PROC3(IN USCODE CHAR(4) , IN USNAME NCHAR(8),
IN UCOL NCHAR(1), IN UTANKA INT,
OUT MSG MVARCHAR(255))
BEGIN
DECLARE EXIT HANDLER FOR SQLCODE VALUE -803
BEGIN
ROLLBACK;
SET MSG=M'重複キー違反のため,ロールバックしました。';
END;
INSERT INTO ZAIKO VALUES(USCODE,USNAME,UCOL,UTANKA,0);
SET MSG=M'登録が完了しました。';
END