GET DIAGNOSTICS-utlåtande

Gäller för:markerad ja Databricks SQL markerad ja Databricks Runtime 16.3 och senare

Hämtar information om ett villkor som hanteras i en undantagshanterare, tillståndet för aktiv transaktion eller antalet rader som påverkas av den senaste DML-instruktionen.

Formuläret CONDITION får endast användas i en villkorshanterare i en sammansatt instruktion. Formuläret TRANSACTION_ACTIVE kan användas som en fristående SQL-instruktion eller inuti en sammansatt instruktion. Formuläret ROW_COUNT får endast användas i en sammansatt instruktion, inklusive brödtexten i en SQL-lagrad procedur.

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 }

Parametrar

  • variable_name

    En lokal variabel eller sessionsvariabel.

  • CONDITION

    Returnerar villkoret som utlöste villkorshanteraren. Du måste utfärda GET DIAGNOSTICS CONDITION 1 som den första instruktionen i hanteraren.

    • MESSAGE_TEXT

      Returnerar meddelandetexten som är associerad med villkoret som en STRING. variable_name måste vara en STRING.

    • RETURNED_SQLSTATE

      Returnerar SQLSTATE som är associerad med det villkor som hanteras som en STRING. variable_name måste vara en STRING.

    • MESSAGE_ARGUMENTS

      Returnerar en MAP<STRING, STRING>-mappning som ges som argument till parametrarna för villkoren i Databricks. För deklarerade villkor är den enda kartnyckeln MESSAGE_TEXT. variable_name måste vara en MAP<STRING, STRING>

    • CONDITION_IDENTIFIER

      Returnerar villkorsnamnet som orsakade undantaget. variable_name måste vara en STRING.

    • LINE_NUMBER

      Returnerar radnumret för instruktionen som utlöser villkoret. NULL om det inte är tillgängligt.

  • TRANSACTION_ACTIVE

    Gäller för:check markerad ja Databricks SQL-kontroll markerad ja Databricks Runtime 18.2 och senare

    Returnerar 1 när -instruktionen körs i en atomisk sammansatt -instruktion (BEGIN ATOMIC ... END); annars returneras 0. variable_name måste vara en INT.

    Atomiska sammansatta uttryck ger samma transaktionssemantik med flera instruktioner som interaktiva transaktioner. se BEGIN ATOMIC för det omgivande omfånget.

  • ROW_COUNT

    Gäller för:check markerad ja Databricks SQL-kontroll markerad ja Databricks Runtime 18 LTS och senare

    Note

    Databricks Runtime 18 är nyare än Databricks Runtime 18.0, 18.1 och 18.2. Funktioner som tidigare skulle ha levererats som en senare numrerad version levereras nu som daterade uppdateringar till Databricks Runtime 18 i stället. Mer information finns i Om enhetliga viktig information.

    Returnerar antalet rader som påverkas av den senast utförda DML-instruktionen som en BIGINT. variable_name måste vara en BIGINT.

    Returnerar NULL när:

    • Ingen instruktion har körts ännu i den omslutande sammansatta brödtexten.
    • Den senaste instruktionen är inte en DML-instruktion (till exempel en SELECT, DDL eller SET VAR).
    • Den senaste DML-instruktionen rapporterar inte ett antal berörda rader. Inbyggda Delta Lake-skrivningar (INSERT, , UPDATEDELETE, MERGE INTOoch COPY INTO) fyller ROW_COUNTi . Skrivningar till icke-Delta-tabeller och skrivningar via Apache Spark-datakällans V2-kataloger returnerar NULL.
    • Hanteraren har angetts. Varje instruktion återställs ROW_COUNT innan den körs, så en undantagshanterare observerar NULLalltid .
    • En CALL instruktion returnerar. När du återvänder från en procedur återställs ROW_COUNT den som ringer, så att anroparen inte kan observera att DML körs i anroparen.

    Högst en variabel per GET DIAGNOSTICS instruktion kan tilldelas från ROW_COUNT. Kombinera med TRANSACTION_ACTIVE genom att lägga till fler tilldelningar i samma instruktion.

    Om du vill samla in antalet berörda rader placerar GET DIAGNOSTICS ... = ROW_COUNT du omedelbart efter DML-instruktionen. Ett kapslat BEGIN ... END block döljer inte det yttre blockets DML (värdet förblir synligt över kapslade sammansatta kroppar), men alla mellanliggande icke-DML-uttryck eller CALL rensar facket.

Exempel

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