GET DIAGNOSTICS ステートメント

適用対象:「はい」とマークされている Databricks SQL 「はい」とマークされている Databricks Runtime 16.3 以降

例外ハンドラー、アクティブトランザクション状態、または最新の DML ステートメントの影響を受ける行数で処理された条件に関する情報を取得します。

CONDITIONフォームは、複合ステートメントの条件ハンドラー内でのみ使用できます。 TRANSACTION_ACTIVE形式は、スタンドアロン SQL ステートメントとして、または複合ステートメント内で使用できます。 ROW_COUNT形式は、SQL ストアド プロシージャの本体を含む複合ステートメント内でのみ使用できます。

構文

GET DIAGNOSTICS CONDITION 1
  { variable_name = condition_info_item } [, ...]

GET DIAGNOSTICS
  { variable_name = statement_info_item } [, ...]

condition_info_item
  { MESSAGE_TEXT |
    RETURNED_SQLSTATE |
    MESSAGE_ARGUMENTS |
    CONDITION_IDENTIFIER |
    LINE_NUMBER }

statement_info_item
  { TRANSACTION_ACTIVE |
    ROW_COUNT }

パラメーター

  • variable_name

    ローカル変数またはセッション変数。

  • CONDITION

    条件ハンドラーをトリガーした条件を返します。 ハンドラーの最初のステートメントとして GET DIAGNOSTICS CONDITION 1 を発行する必要があります。

    • MESSAGE_TEXT

      条件に関連付けられたメッセージ テキストを STRINGとして返します。 variable_nameSTRING である必要があります。

    • RETURNED_SQLSTATE

      SQLSTATEとして処理される条件に関連付けられているSTRINGを返します。 variable_nameSTRING である必要があります。

    • MESSAGE_ARGUMENTS

      Databricks 条件のパラメーターへの引数として指定された MAP<STRING, STRING> マッピングを返します。 宣言された条件の場合、マップ キーは MESSAGE_TEXTのみです。 variable_nameMAP<STRING, STRING> でなければなりません

    • CONDITION_IDENTIFIER

      例外の原因となった条件名を返します。 variable_nameSTRING である必要があります。

    • LINE_NUMBER

      条件を発生させるステートメントの行番号を返します。 NULL が使用できない場合

  • TRANSACTION_ACTIVE

    適用対象:はい Databricks SQL チェックが Databricks Runtime 18.2 以降" とマークされているチェック

    ステートメントがアトミック複合ステートメント (BEGIN ATOMIC ... END) 内で実行されるときに1を返します。それ以外の場合は、0を返します。 variable_nameINTである必要があります。

    アトミック複合ステートメントは、 対話型トランザクションと同じマルチステートメント トランザクション セマンティクスを提供します。周囲のスコープについては、 BEGIN ATOMIC を参照してください。

  • ROW_COUNT

    適用対象:はい Databricks SQL チェックが Databricks Runtime 18.3 以降" とマークされているチェック

    最近実行された DML ステートメントの影響を受ける行数を BIGINTとして返します。 variable_nameBIGINT である必要があります。

    次の場合に NULL を返します。

    • 外側の複合体ではまだステートメントが実行されていません。
    • 最新のステートメントは DML ステートメントではありません (たとえば、 SELECTDDLSET VAR)。
    • 最新の DML ステートメントでは、影響を受ける行数は報告されません。 組み込みの Delta Lake 書き込み (INSERTUPDATEDELETEMERGE INTO、および COPY INTO) は、 ROW_COUNTを設定します。 Delta 以外のテーブルへの書き込みと Apache Spark データ ソース V2 カタログを介した書き込みでは、 NULLが返されます。
    • ハンドラーが入力されます。 各ステートメントは実行前に ROW_COUNT をリセットするため、例外ハンドラーは常に NULLを監視します。
    • CALL ステートメントが返されます。 プロシージャから戻すと呼び出し元の ROW_COUNT がリセットされるため、呼び出し元は呼び出し先内で実行された DML を観察できません。

    GET DIAGNOSTICSステートメントごとに最大 1 つの変数をROW_COUNTから割り当てることができます。 同じステートメントに割り当てを追加して、 TRANSACTION_ACTIVE と組み合わせます。

    影響を受ける行数をキャプチャするには、DML ステートメントの直後に GET DIAGNOSTICS ... = ROW_COUNT を配置します。 入れ子になった BEGIN ... END ブロックは外部ブロックの DML を非表示にしません (値は入れ子になった複合本体全体で表示されたままです)。ただし、DML 以外のステートメントまたは CALL が介在している場合は、スロットがクリアされます。

例示

-- Capture details of a handled condition in an exception handler.
> CREATE OR REPLACE TABLE emp(name STRING, salary DECIMAL(10, 2));

> BEGIN
    DECLARE EXIT HANDLER FOR DIVIDE_BY_ZERO
      BEGIN
        DECLARE cond STRING;
        DECLARE message STRING;
        DECLARE state STRING;
        DECLARE args MAP<STRING, STRING>;
        DECLARE line BIGINT;
        DECLARE argstr STRING;
        DECLARE log STRING;
        GET DIAGNOSTICS CONDITION 1
           cond    = CONDITION_IDENTIFIER,
           message = MESSAGE_TEXT,
           state   = RETURNED_SQLSTATE,
           args    = MESSAGE_ARGUMENTS,
           line    = LINE_NUMBER;
        SET argstr = array_join(transform(map_entries(args), t -> concat_ws(' ', 'Param:', t.key, 'Val:', t.value)), ' ');
        SET log = 'Condition: ' || cond ||
                  ' Message: ' || message ||
                  ' SQLSTATE: ' || state ||
                  ' Args: ' || argstr ||
                  ' Line: ' || line;
        VALUES (log);
      END;
    SELECT 10/0;
  END;
 Condition: DIVIDE_BY_ZERO Message: Division by zero. Use try_divide to tolerate divisor being 0 and return NULL instead. If necessary, set <config> to “false” to bypass this error. SQLATTE: 22012 Args:  Parm: config Val: ANSI_MODE Line: 28
-- Check whether the current statement runs inside an atomic transaction.
> DECLARE VARIABLE tx INT;

> GET DIAGNOSTICS tx = TRANSACTION_ACTIVE;
> SELECT tx;
 0

> BEGIN ATOMIC
    DECLARE tx INT;
    GET DIAGNOSTICS tx = TRANSACTION_ACTIVE;
    SELECT tx;
  END;
 1
-- Capture the number of rows affected by the most recent DML statement.
> CREATE OR REPLACE TABLE emp(name STRING, salary DECIMAL(10, 2));

> BEGIN
    DECLARE rc BIGINT;
    INSERT INTO emp VALUES ('Alice', 100.00), ('Bob', 200.00), ('Carol', 300.00);
    GET DIAGNOSTICS rc = ROW_COUNT;
    VALUES ('Inserted ' || rc || ' rows.');
    DELETE FROM emp WHERE salary >= 200.00;
    GET DIAGNOSTICS rc = ROW_COUNT;
    VALUES ('Deleted ' || rc || ' rows.');
  END;
 Inserted 3 rows.
 Deleted 2 rows.