GET DIAGNOSTICS-Anweisung

Gilt für:mit Häkchen markiert: ja Databricks SQL mit Häkchen markiert: ja Databricks Runtime 16.3 und höher

Ruft Informationen zu einer Bedingung ab, die in einem Ausnahmehandler, dem Status der aktiven Transaktion oder der Anzahl der Zeilen behandelt wird, die von der letzten DML-Anweisung betroffen sind.

Das CONDITION Formular kann nur innerhalb eines Bedingungshandlers in einer zusammengesetzten Anweisung verwendet werden. Das TRANSACTION_ACTIVE Formular kann als eigenständige SQL-Anweisung oder in einer Verbund-Anweisung verwendet werden. Das ROW_COUNT Formular kann nur in einer zusammengesetzten Anweisung verwendet werden, einschließlich des Textkörpers einer gespeicherten SQL-Prozedur.

Syntax

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 }

Die Parameter

  • variable_name

    Eine lokale Variable oder Sitzungsvariable.

  • CONDITION

    Gibt die Bedingung zurück, die den Bedingungshandler ausgelöst hat. Sie müssen als erste Anweisung im Handler ausstellen GET DIAGNOSTICS CONDITION 1 .

    • MESSAGE_TEXT

      Gibt den Meldungstext, der der Bedingung zugeordnet ist, als zurück STRING. variable_name muss vom Typ STRING sein.

    • RETURNED_SQLSTATE

      Gibt die zugehörige Bedingung zurück, die SQLSTATE als STRING. variable_name muss vom Typ STRING sein.

    • MESSAGE_ARGUMENTS

      Gibt eine MAP<STRING, STRING> Zuordnung zurück, die als Argumente für die Parameter von Databricks-Bedingungen bereitgestellt wird. Für deklarierte Bedingungen ist MESSAGE_TEXTder einzige Zuordnungsschlüssel . variable_name muss ein MAP<STRING, STRING>

    • CONDITION_IDENTIFIER

      Gibt den Bedingungsnamen zurück, der die Ausnahme verursacht hat. variable_name muss vom Typ STRING sein.

    • LINE_NUMBER

      Gibt die Zeilennummer der Anweisung zurück, die die Bedingung auslöst. NULL falls nicht verfügbar.

  • TRANSACTION_ACTIVE

    Gilt für:check marked yes Databricks SQL check marked yes Databricks Runtime 18.2 and above

    Gibt zurück 1 , wenn die Anweisung innerhalb einer atomverbundenen Anweisung (BEGIN ATOMIC ... END); andernfalls wird zurückgegeben 0. variable_name muss ein INT.

    Atomic compound statements provide the same multi-statement transactional semantics as interactive transactions; siehe BEGIN ATOMIC den umgebenden Bereich.

  • ROW_COUNT

    Gilt für:check marked yes Databricks SQL check marked yes Databricks Runtime 18.3 and above

    Gibt die Anzahl der Zeilen zurück, die von der zuletzt ausgeführten DML-Anweisung als eine BIGINT. variable_name muss vom Typ BIGINT sein.

    Gibt zurück NULL , wenn:

    • Im eingeschlossenen zusammengesetzten Textkörper wurde noch keine Anweisung ausgeführt.
    • Die neueste Anweisung ist keine DML-Anweisung (z. B. eine SELECT, DDL oder SET VAR).
    • Die letzte DML-Anweisung meldet keine Anzahl betroffener Zeilen. Integrierte Delta Lake-Schreibvorgänge (INSERT, UPDATE, , DELETEMERGE INTOund COPY INTO) füllen ROW_COUNT. Schreibt in Nicht-Delta-Tabellen und schreibt über Apache Spark-Datenquellen-V2-Kataloge zurück NULL.
    • Der Handler wird eingegeben. Jede Anweisung wird zurückgesetzt ROW_COUNT , bevor sie ausgeführt wird, sodass ein Ausnahmehandler immer beobachtet wird NULL.
    • Eine CALL Anweisung gibt zurück. Das Zurückgeben von einer Prozedur wird im Aufrufer zurückgesetzt ROW_COUNT , sodass der Aufrufer keine DML beobachten kann, die innerhalb des Angerufenen ausgeführt wird.

    Es kann höchstens eine Variable pro GET DIAGNOSTICS Anweisung zugewiesen ROW_COUNTwerden. Kombinieren Sie diese Kombination, TRANSACTION_ACTIVE indem Sie der gleichen Anweisung weitere Zuordnungen hinzufügen.

    Wenn Sie die Anzahl betroffener Zeilen erfassen möchten, platzieren Sie sie GET DIAGNOSTICS ... = ROW_COUNT unmittelbar hinter der DML-Anweisung. Ein geschachtelter BEGIN ... END Block blendet die DML des äußeren Blocks nicht aus (der Wert bleibt über geschachtelte Verbundkörper sichtbar), aber alle dazwischen liegenden Nicht-DML-Anweisung oder CALL löscht den Steckplatz.

Beispiele

-- 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.