GET DIAGNOSTICS診断情報取得

機能

直前に実行したSQL文が次のどれかの場合,そのエラー情報及び診断情報を,診断領域から取得します。

また,直前に実行したSQL文がリモートデータベースアクセスを実行した場合には,分散サーバが返したエラー情報を含みます。

リモートデータベースアクセスを実行した場合の,エラーの詳細情報の取得と対処については,マニュアル「HiRDB Version 8 UAP開発ガイド」の「分散サーバで発生したエラーの対処」を参照してください。

ルーチンのSQLオブジェクトの再作成時,この診断情報に,正常に再作成したルーチンの情報が含まれます。

形式

 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
            |RDNODE_NAME
            |QUERY_NAME
            |CONDITION_IDENTIFIER}

オペランド

NUMBER
診断領域中の診断情報の数を取得する場合に指定します。データ型はSMALLINTを指定してください。
MORE
診断情報の数が,診断領域に格納できる数を超えたかどうかの情報を取得する場合に指定します。
データ型はCHAR,長さは1バイトを指定してください。
診断領域にすべての診断情報が設定されている場合はN,そうでない場合はYが格納されます。

何番目の診断情報を取得するかを示す値を埋込み変数で指定します。

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 ALIAS××CREATE ALIAS
CREATE AUDIT××CREATE AUDIT
CREATE CONNECTION SECURITY××CREATE CONNECTION SECURITY
CREATE FOREIGN INDEX××CREATE FOREIGN INDEX
CREATE FOREIGN TABLE××CREATE FOREIGN TABLE
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 SERVER××CREATE SERVER
CREATE TABLE××CREATE TABLE
CREATE TRIGGER××CREATE TRIGGER
CREATE TYPE××CREATE TYPE
CREATE USER MAPPING××CREATE USER MAPPING
CREATE VIEW××CREATE VIEW
CREATE PUBLIC VIEW××CREATE VIEW
DROP ALIAS××DROP ALIAS
DROP AUDIT××DROP AUDIT
DROP CONNECTION SECURITY××DROP CONNECTION SECURITY
DROP DATA TYPE××DROP DATA TYPE
DROP FOREIGN INDEX××DROP FOREIGN INDEX
DROP FOREIGN TABLE××DROP FOREIGN TABLE
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 SERVER××DROP SERVER
DROP TABLE××DROP TABLE
DROP TRIGGER××DROP TRIGGER
DROP USER MAPPING××DROP USER MAPPING
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 アクセス権限××GRANT ACCESS
GRANT AUDIT××GRANT AUDIT
REVOKE CONNECT××REVOKE CONNECT
REVOKE DBA××REVOKE DBA
REVOKE RDAREA××REVOKE RDAREA
REVOKE SCHEMA××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
RDノード指定CONNECT文×××CONNECT to RDNODE
RDノード指定DISCONNECT文×××DISCONNECT to RDNODE
ROLLBACK文ROLLBACK
SET CONNECTION文×××SET CONNECTION
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バイト)を指定してください。
RDNODE_NAME
リモートデータベースアクセス実行時に,エラーが発生したRDノードの名称を取得したい場合に指定します。データ型はVARCHAR,長さは30バイト(文字集合名UTF16を指定した場合は60バイト)を指定してください。
QUERY_NAME
WITH句指定のある動的SELECT文,及びカーソル宣言を実行した場合,エラーが発生した問合せ指定の問合せ名を取得したい場合に指定します。データ型はVARCHAR,長さは30バイト(文字集合名UTF16を指定した場合は60バイト)を指定してください。
CONDITION_IDENTIFIER
SQL手続き中又はトリガ中で実行された,SIGNAL文,又はRESIGNAL文に指定した条件名,又はSQLSTATE値を取得したい場合に指定します。データ型はVARCHAR,長さは30バイト(文字集合名UTF16を指定した場合は60バイト)を指定してください。
SQLSTATE値を指定した場合は,'SQLSTATE:XXXXX'(XXXXXは指定したSQLSTATE値)が設定されます。

共通規則

  1. GET DIAGNOSTICSは,動的に実行できません。
  2. 直前に実行したSQLの結果だけ取得できます。取得できるSQLについては,表6-2を参照してください。
  3. 条件番号を指定する埋込み変数のデータ型は,SMALLINTを指定してください。
  4. 文情報項目,及び条件情報項目を受け取る埋込み変数のデータ型は,それぞれの項目のデータ型と同じ型を指定してください。
  5. 条件番号には,0以下の値,又は診断領域中のエラーの数を超える値は指定できません。
  6. SQL解析前に発生したエラーはGET DIAGNOSTICSでは診断情報が取得できない場合があります。このとき,GET DIAGNOSTICSを実行すると0件が返ってきます。エラー情報はエラー発生時のSQLCAを参照してください。
  7. 条件情報項目名の説明の中で,設定する情報を明記していないSQLについては,1バイトの空白,又は0が設定されます。
  8. 関数実行時に発生したエラーに対して,GET DIAGNOSTICSでは次の診断情報が取得できない場合があります。
    • ROUTINE_TYPE
    • ROUTINE_SCHEMA
    • ROUTINE_NAME

使用例

直前に実行したCREATE FUNCTIONの次の診断情報を取得します。

 CREATE FUNCTION NEXTDAY(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