GET 診斷陳述

適用於:確認標示為是 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_name 必須是 STRING。

    • RETURNED_SQLSTATE

      傳回與正在處理的條件相關聯的 SQLSTATE 作為 STRING。 variable_name 必須是 STRING。

    • MESSAGE_ARGUMENTS

      傳回作為 Databricks 條件參數提供的 MAP<STRING, STRING> 對應。 針對宣告的條件,唯一的映射鍵是 MESSAGE_TEXT。 variable_name 必須是 MAP<STRING, STRING>

    • CONDITION_IDENTIFIER

      傳回造成例外狀況的條件名稱。 variable_name 必須是 STRING。

    • LINE_NUMBER

      傳回引發條件之 語句的行號。 如果無法使用則NULL。

  • TRANSACTION_ACTIVE

    適用於:勾選標記為是 Databricks SQL 勾 選為 Databricks 執行時間 18.2 及以上版本

    當陳述句在原子複合陳述中執行時返回 1 (BEGIN ATOMIC ... END;否則 0返回 )。 variable_name 必須是 INT。

    原子複合語句提供與 互動式交易相同的多語句交易語意;請參閱 BEGIN ATOMIC 周邊的範圍。

  • ROW_COUNT

    適用於:勾選標記為是 Databricks SQL 勾選 Databricks 執行時間 18 LTS 及以上

    Note

    Databricks Runtime 18 比 Databricks Runtime 18.0、18.1 和 18.2 更新。 原本會以後期編號版本推出的功能,現在改為以 Databricks Runtime 18 的更新形式提供。 詳情請參見 關於統一發布說明。

    回傳最近執行的 DML 語句影響的列數,作為 BIGINT。 variable_name 必須是 BIGINT。

    回歸 NULL 時間:

    • 目前尚未在包圍的複合體中執行任何聲明。
    • 最新的陳述句不是 DML 陳述(例如 a SELECT、 DDL 或 SET VAR)。
    • 最新的 DML 聲明並未報告受影響的列數。 內建的 Delta Lake 會寫入 (INSERT, UPDATE, DELETEMERGE INTOCOPY INTO, ) 填充。ROW_COUNT 寫入非 Delta 資料表,並透過 Apache Spark 資料來源 V2 目錄回傳 NULL。
    • 操作員被報名。 每個敘述在執行前都會重置 ROW_COUNT ,因此例外處理器總是觀察到 NULL。
    • 一個 CALL 陳述回傳。 從程序回傳會重置 ROW_COUNT 呼叫者,因此呼叫者無法觀察被呼叫者內部執行的 DML。

    每個GET DIAGNOSTICS語句最多可指派一個變數。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.