6.10.1 GET DIAGNOSTICSの形式と規則
(1) 機能
直前に実行したSQL文が次のどれかの場合,そのエラー情報及び診断情報を,診断領域から取得します。
-
定義系SQL
-
操作系SQL
-
制御系SQL
-
埋込み言語文法(INSTALL JAR,REPLACE JAR,REMOVE JAR,INSTALL CLIB,REPLACE CLIB,REMOVE CLIB)
-
ルーチン制御SQL
ルーチンのSQLオブジェクトの再作成時,この診断情報に,正常に再作成したルーチンの情報が含まれます。
(2) 形式
GET DIAGNOSTICS {:埋込み変数=文情報項目名 〔,:埋込み変数=文情報項目名〕… |EXCEPTION 条件番号 :埋込み変数=条件情報項目名 〔,:埋込み変数=条件情報項目名〕…} 文情報項目名::={NUMBER|MORE} 条件情報項目名::={RETURNED_SQLCODE |ERROR_POSITION |ERROR_SQL_NO |ERROR_SQL |ROUTINE_TYPE |ROUTINE_SCHEMA |ROUTINE_NAME |TRIGGER_SCHEMA |TRIGGER_NAME |CONSTRAINT_SCHEMA |CONSTRAINT_NAME |MESSAGE_TEXT |QUERY_NAME |CONDITION_IDENTIFIER}
(3) オペランド
(a) 文情報項目名
- NUMBER
-
診断領域中の診断情報の数を取得する場合に指定します。データ型はSMALLINTを指定してください。
- MORE
-
診断情報の数が,診断領域に格納できる数を超えたかどうかの情報を取得する場合に指定します。
データ型はCHAR,長さは1バイトを指定してください。
診断領域にすべての診断情報が設定されている場合はN,そうでない場合はYが格納されます。
(b) 条件番号
何番目の診断情報を取得するかを示す値を埋込み変数で指定します。
(c) 条件情報項目名
- RETURNED_SQLCODE
-
リターンコード(SQLCODE)の値を取得する場合に指定します。データ型はINTEGERを指定してください。
- ERROR_POSITION
-
構文エラーが発生した場合の,SQL中のエラーの位置を取得するときに指定します。
データ型はINTEGERを指定してください。構文エラー以外のエラーが発生した場合は,0が設定されます。
- ERROR_SQL_NO
-
次のどれかのSQLを実行した場合,そのルーチン中でエラーとなったSQL手続き文を示す番号を取得したいときに指定します。
-
CREATE PROCEDURE
-
CREATE FUNCTION
-
CREATE TYPE
-
CREATE TRIGGER
-
ALTER PROCEDURE
-
ALTER ROUTINE
-
ALTER TRIGGER
-
CALL文
-
トリガを引き起こす操作系SQL(ただし,取得できる情報はトリガの動作についてだけです)
番号は,手続き中のSQL手続き文の開始位置の順序で,各SQL手続き文に0から順に付けたものです。データ型はINTEGERを指定してください。
-
- ERROR_SQL
-
診断情報のSQLの種別を示す文字列を取得したいときに指定します。
データ型はVARCHAR,長さは32バイト(文字集合名UTF16を指定した場合は64バイト)を指定してください。
設定される文字列を次の表に示します。
表6‒2 ERROR_SQLに設定される文字列 分類(SQL種別)
文字列設定の有無
設定される文字列
ルーチン
左記以外
定義
実行
前処理
実行
定義系
SQL
ALTER INDEX
×
×
○
○
ALTER INDEX
ALTER PROCEDURE
×
×
○
○
ALTER PROCEDURE
ALTER ROUTINE
×
×
○
○
ALTER ROUTINE
ALTER TABLE
×
×
○
○
ALTER TABLE
ALTER TRIGGER
×
×
○
○
ALTER TRIGGER
COMMENT(表に注釈を付ける)
×
×
○
○
COMMENT TABLE
COMMENT(列に注釈を付ける)
×
×
○
○
COMMENT COLUMN
CREATE AUDIT
×
×
○
○
CREATE AUDIT
CREATE CONNECTION SECURITY
×
×
○
○
CREATE CONNECTION SECURITY
CREATE FUNCTION
×
×
○
○
CREATE FUNCTION
CREATE PUBLIC FUNCTION
×
×
○
○
CREATE FUNCTION
CREATE INDEX
×
×
○
○
CREATE INDEX
CREATE PROCEDURE
×
×
○
○
CREATE PROCEDURE
CREATE PUBLIC PROCEDURE
×
×
○
○
CREATE PROCEDURE
CREATE SCHEMA
×
×
○
○
CREATE SCHEMA
CREATE SEQUENCE
×
×
○
○
CREATE SEQUENCE
CREATE TABLE
×
×
○
○
CREATE TABLE
CREATE TRIGGER
×
×
○
○
CREATE TRIGGER
CREATE TYPE
×
×
○
○
CREATE TYPE
CREATE VIEW
×
×
○
○
CREATE VIEW
CREATE PUBLIC VIEW
×
×
○
○
CREATE VIEW
DROP AUDIT
×
×
○
○
DROP AUDIT
DROP CONNECTION SECURITY
×
×
○
○
DROP CONNECTION SECURITY
DROP DATA TYPE
×
×
○
○
DROP DATA TYPE
DROP FUNCTION
×
×
○
○
DROP FUNCTION
DROP PUBLIC FUNCTION
×
×
○
○
DROP FUNCTION
DROP INDEX
×
×
○
○
DROP INDEX
DROP PROCEDURE
×
×
○
○
DROP PROCEDURE
DROP PUBLIC PROCEDURE
×
×
○
○
DROP PROCEDURE
DROP SCHEMA
×
×
○
○
DROP SCHEMA
DROP SEQUENCE
×
×
○
○
DROP SEQUENCE
DROP TABLE
×
×
○
○
DROP TABLE
DROP TRIGGER
×
×
○
○
DROP TRIGGER
DROP VIEW
×
×
○
○
DROP VIEW
DROP PUBLIC VIEW
×
×
○
○
DROP VIEW
GRANT CONNECT
×
×
○
○
GRANT CONNECT
GRANT DBA
×
×
○
○
GRANT DBA
GRANT RDAREA
×
×
○
○
GRANT RDAREA
GRANT SCHEMA
×
×
○
○
GRANT SCHEMA
GRANT SCHEMA OPERATION
×
×
○
○
GRANT SCHEMA
GRANT アクセス権限
×
×
○
○
GRANT ACCESS
GRANT AUDIT
×
×
○
○
GRANT AUDIT
REVOKE CONNECT
×
×
○
○
REVOKE CONNECT
REVOKE DBA
×
×
○
○
REVOKE DBA
REVOKE RDAREA
×
×
○
○
REVOKE RDAREA
REVOKE SCHEMA
×
×
○
○
REVOKE SCHEMA
REVOKE SCHEMA OPERATION
×
×
○
○
REVOKE SCHEMA
REVOKE アクセス権限
×
×
○
○
REVOKE ACCESS
操作系
SQL
ALLOCATE CURSOR文
×
×
×
○
ALLOCATE CURSOR
ASSIGN LIST文
×
×
○
○
ASSIGN LIST
CALL文
○
○
○
○
CALL
CLOSE文
○
○
×
×
CLOSE
×
×
○
○
(カーソルに指定したSQL種別の,この項目を参照してください)
DEALLOCATE PREPARE文
×
×
×
○
−
DECLARE CURSOR
○
×
×
×
DECLARE CURSOR
×
×
○
○
(動的SELECT文の,この項目を参照してください)
DELETE文
○
○
○
○
DELETE
準備可能動的DELETE文:位置付け
×
×
○
○
DELETE
DESCRIBE文
×
×
○
○
(DESCRIBE文に指定したSQL種別の,この項目を参照してください)
DESCRIBE CURSOR文
×
×
○
○
(DESCRIBE CURSOR文に指定したSQL種別の,この項目を参照してください)
DESCRIBE TYPE文
×
×
○
○
(DESCRIBE TYPE文に指定したSQL種別の,この項目を参照してください)
DROP LIST文
×
×
○
○
DROP LIST
EXECUTE文
×
×
○
○
(EXECUTE文で実行したSQL種別の,この項目を参照してください)
EXECUTE IMMEDIATE文
×
×
○
○
(EXECUTE IMMEDIATE文で実行したSQL種別の,この項目を参照してください)
FETCH文
○
○
×
×
FETCH
×
×
○
○
(カーソルに指定したSQL種別の,この項目を参照してください)
FREE LOCATOR文
×
×
○
○
FREE LOCATOR
INSERT文
○
○
○
○
INSERT
OPEN文
○
○
×
×
OPEN
×
×
○
○
(カーソルに指定したSQL種別の,この項目を参照してください)
PREPARE文
○
○
○
○
(PREPARE文に指定したSQL種別の,この項目を参照してください)
PURGE TABLE文
○
○
○
○
PURGE TABLE
1行SELECT文
○
○
○
○
SELECT
動的SELECT文
×
×
○
○
SELECT
UPDATE文
○
○
○
○
UPDATE
準備可能動的UPDATE文:位置付け
×
×
○
○
UPDATE
代入文
○
○
○
○
SET
制御系
SQL
CALL COMMAND文
○
○
○
○
CALL COMMAND
COMMIT文
○
○
○
○
COMMIT
CONNECT文
×
×
×
×
−
DISCONNECT文
×
×
×
×
−
LOCK文
○
○
○
○
LOCK TABLE
ROLLBACK文
○
○
○
○
ROLLBACK
SET SESSION AUTHORIZATION文
×
×
○
○
SET SESSION AUTHORIZATION
埋込み
言語
文法
BEGIN DECLARE SECTION
×
×
×
×
−
END DECLARE SECTION
×
×
×
×
(該当しません)
ALLOCATE CONNECTION HANDLE
×
×
×
×
−
FREE CONNECTION HANDLE
×
×
×
×
−
DECLARE CONNECTION HANDLE SET
×
×
×
×
(該当しません)
DECLARE CONNECTION HANDLE UNSET
×
×
×
×
(該当しません)
GET CONNECTION HANDLE
×
×
×
×
−
COPY
×
×
×
×
(該当しません)
GET DIAGNOSTICS
×
×
×
×
−
COMMAND EXECUTE
×
×
×
×
−
SQL先頭子
×
×
×
×
(該当しません)
SQL終了子
×
×
×
×
(該当しません)
WHENEVER
×
×
×
×
−
SQLCODE変数
×
×
×
×
(該当しません)
SQLSTATE変数
×
×
×
×
(該当しません)
PDCNCTHDL型変数の宣言
×
×
×
×
(該当しません)
INSTALL JAR
×
×
○
○
INSTALL JAR
REPLACE JAR
×
×
○
○
REPLACE JAR
REMOVE JAR
×
×
○
○
REMOVE JAR
INSTALL CLIB
×
×
○
○
INSTALL CLIB
REPLACE CLIB
×
×
○
○
REPLACE CLIB
REMOVE CLIB
×
×
○
○
REMOVE CLIB
DECLARE AUDIT INFO SET
×
×
×
×
(該当しません)
ルーチ
ン制御
SQL
SQL変数宣言
○
○
×
×
DECLARE
カーソル宣言
○
×
×
×
DECLARE CURSOR
○
○
×
×
SELECT
条件宣言
○
×
×
×
DECLARE CONDITION
ハンドラ宣言
○
×
×
×
DECLARE HANDLER
SQL手続き文
○
○
×
×
(SQL手続き文に指定したSQL種別の,この項目を参照してください)
複合文
○
○
×
×
BEGIN
IF文
○
○
×
×
IF
LEAVE文
○
○
×
×
LEAVE
RETURN文
○
○
×
×
RETURN
WHILE文
○
○
×
×
WHILE
FOR文
○
○
×
×
FOR
WRITE LINE文
○
○
×
×
WRITE LINE
SIGNAL文
○
○
×
×
SIGNAL
RESIGNAL文
○
○
×
×
RESIGNAL
上記に分類できない場合
○
○
○
○
半角空白
- ROUTINE_TYPE
-
エラーとなった関数又は手続きの種別を取得したい場合に指定します。データ型はCHAR,長さは1バイト(文字集合名UTF16を指定した場合は2バイト)を指定してください。種別が手続きの場合はP,関数の場合はFが設定されます。
- ROUTINE_SCHEMA
-
エラーとなった関数又は手続きの認可識別子を取得したい場合に指定します。データ型はVARCHAR,長さは30バイト(文字集合名UTF16を指定した場合は60バイト)を指定してください。
以下のエラーの場合は認可識別子に”PUBLIC”が設定されます。
-
パブリック関数,パブリック手続きの定義,削除時のエラー
-
パブリック手続きのCALL文実行時のエラー
-
- ROUTINE_NAME
-
エラーとなった関数又は手続きの識別子を取得したい場合に指定します。データ型はVARCHAR,長さは30バイト(文字集合名UTF16を指定した場合は60バイト)を指定してください。
- TRIGGER_SCHEMA
-
エラーとなったトリガの認可識別子を取得したい場合に指定します。データ型はVARCHAR,長さは30バイト(文字集合名UTF16を指定した場合は60バイト)を指定してください。
- TRIGGER_NAME
-
エラーとなったトリガの認可識別子を取得したい場合に指定します。データ型はVARCHAR,長さは30バイト(文字集合名UTF16を指定した場合は60バイト)を指定してください。
- CONSTRAINT_SCHEMA
-
検査制約,参照制約で制約違反エラーとなった制約の認可識別子を取得したい場合に指定します。データ型はVARCHAR,長さは30バイト(文字集合名UTF16を指定した場合は60バイト)を指定してください。
- CONSTRAINT _NAME
-
検査制約,参照制約で制約違反エラーとなった制約の制約名を取得したい場合に指定します。データ型はVARCHAR,長さは30バイト(文字集合名UTF16を指定した場合は60バイト)を指定してください。
- MESSAGE_TEXT
-
メッセージテキストを取得したい場合に指定します。データ型はVARCHAR,長さは254バイト(文字集合名UTF16を指定した場合は508バイト)を指定してください。
- QUERY_NAME
-
WITH句指定のある動的SELECT文,及びカーソル宣言を実行した場合,エラーが発生した問合せ指定の問合せ名を取得したい場合に指定します。データ型はVARCHAR,長さは30バイト(文字集合名UTF16を指定した場合は60バイト)を指定してください。
- CONDITION_IDENTIFIER
-
SQL手続き中又はトリガ中で実行された,SIGNAL文,又はRESIGNAL文に指定した条件名,又はSQLSTATE値を取得したい場合に指定します。データ型はVARCHAR,長さは30バイト(文字集合名UTF16を指定した場合は60バイト)を指定してください。
SQLSTATE値を指定した場合は,'SQLSTATE:XXXXX'(XXXXXは指定したSQLSTATE値)が設定されます。
(4) 共通規則
-
GET DIAGNOSTICSは,動的に実行できません。
-
直前に実行したSQLの結果だけ取得できます。取得できるSQLについては,表「ERROR_SQLに設定される文字列」を参照してください。
-
条件番号を指定する埋込み変数のデータ型は,SMALLINTを指定してください。
-
文情報項目,及び条件情報項目を受け取る埋込み変数のデータ型は,それぞれの項目のデータ型と同じ型を指定してください。
-
条件番号には,0以下の値,又は診断領域中のエラーの数を超える値は指定できません。
-
SQL解析前に発生したエラーはGET DIAGNOSTICSでは診断情報が取得できない場合があります。このとき,GET DIAGNOSTICSを実行すると0件が返ってきます。エラー情報はエラー発生時のSQLCAを参照してください。
-
条件情報項目名の説明の中で,設定する情報を明記していないSQLについては,1バイトの空白,又は0が設定されます。
-
関数実行時に発生したエラーに対して,GET DIAGNOSTICSでは次の診断情報が取得できない場合があります。
-
ROUTINE_TYPE
-
ROUTINE_SCHEMA
-
ROUTINE_NAME
-
(5) 使用例
直前に実行したCREATE FUNCTIONの次の診断情報を取得します。
-
リターンコード(データ型がINTEGERの埋込み変数XSQLCODE)
-
構文エラーが発生した場合のSQL中のエラーの位置(データ型がINTEGERの埋込み変数XPOSITION)
-
ルーチン中でエラーとなったSQL手続き文を示す番号(データ型がINTEGERの埋込み変数XSQL_NO)
-
ルーチン中でエラーとなったSQL手続き文の種別を示す文字列(データ型がVARCHAR(32)の埋込み変数XSQL)
-
メッセージテキスト(データ型がVARCHAR(254)の埋込み変数XMESSAGE)
CREATE FUNCTION NEXT_DAY(INDATE DATE,曜日 NCHAR) RETURNS DATE BEGIN DECLARE SDOW,TDOW INTEGER; SET TDOW=(CASE 曜日 WHEN N'日' THEN 0 WHEN N'月' THEN 1 WHEN N'火' THEN 2 WHEN N'水' THEN 3 WHEN N'木' THEN 4 WHEN N'金' THEN 5 ELSE 6 END); SET SDOW=MOD(DAYS(INDATE),7); RETURN (INDATE + (CASE WHEN TDOW>SDOW THEN TDOW-SDOW ELSE 7+TDOW-SDOW END) DAYS); END GET DIAGNOSTICS EXCEPTION 1 :XSQLCODE=RETURN_SQLCODE, :XPOSITION=ERROR_POSITION, :XSQL_NO=ERROR_SQL_NO, :XSQL=ERROR_SQL, :XMESSAGE=MESSAGE_TEXT