スケーラブルデータベースサーバ HiRDB Version 8 SQLリファレンス
機能
複数のSQL文をまとめて,一つのSQL文(複合文)として実行します。
形式
〔開始ラベル:〕 BEGIN 〔{SQL変数宣言;|カーソル宣言;|条件宣言;|ハンドラ宣言;}〕… 〔SQL手続き文;〕… END 〔終了ラベル〕 SQL変数宣言::=DECLARE SQL変数名〔,SQL変数名〕…データ型 〔DEFAULT句〕 DEFAULT句::=DEFAULT 〔既定値〕 条件宣言::=DECLARE 条件名 CONDITION 〔FOR SQLCODE値〕 ハンドラ宣言::=DECLARE ハンドラ種別 HANDLER FOR 条件値〔,条件値〕… ハンドラ動作 ハンドラ種別::={CONTINUE|EXIT} 条件値::={SQLERROR|NOT FOUND|条件名|SQLCODE値} ハンドラ動作::=SQL手続き文 SQLCODE値::=SQLCODE 〔VALUE〕 整数定数 |
オペランド
複合文の文ラベルを指定します。
複合文の開始を指定します。
複合文中で使用する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
All Rights Reserved. Copyright (C) 2006, 2016, Hitachi, Ltd.