GET instrukcja DIAGNOSTYKA

Dotyczy:oznaczone jako tak Databricks SQL oznaczone jako tak Databricks Runtime 16.3 lub nowszy

Pobiera informacje o warunku obsługiwanym w procedurze obsługi wyjątków, stanie aktywnej transakcji lub liczbie wierszy, których dotyczy najnowsza instrukcja DML.

Formularz CONDITION może być używany tylko w procedurze obsługi warunku w instrukcji złożonej. Formularz TRANSACTION_ACTIVE może być używany jako autonomiczna instrukcja SQL lub wewnątrz instrukcji złożonej. Formularz ROW_COUNT może być używany tylko w instrukcji złożonej, w tym w treści procedury składowanej SQL.

Składnia

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 }

Parametry

  • variable_name

    Zmienna lokalna lub zmienna sesji.

  • CONDITION

    Zwraca warunek, który wyzwolił procedurę obsługi warunków. Musisz wydać GET DIAGNOSTICS CONDITION 1 pierwszą instrukcję w procedurze obsługi.

    • MESSAGE_TEXT

      Zwraca tekst wiadomości skojarzony z warunkiem jako STRING. variable_name musi być STRING.

    • RETURNED_SQLSTATE

      Zwraca SQLSTATE powiązane z warunkiem obsługiwanym jako STRING. variable_name musi być STRING.

    • MESSAGE_ARGUMENTS

      Zwraca mapowanie MAP<STRING, STRING>, które zostało podane jako argumenty do parametrów warunków Databricks. W przypadku zadeklarowanych warunków jedynym kluczem mapy jest MESSAGE_TEXT. variable_name musi być to MAP<STRING, STRING>

    • CONDITION_IDENTIFIER

      Zwraca nazwę warunku, która spowodowała wyjątek. variable_name musi być STRING.

    • LINE_NUMBER

      Zwraca numer wiersza instrukcji podnoszącej warunek. NULL, jeśli nie jest dostępny.

  • TRANSACTION_ACTIVE

    Dotyczy:sprawdzanie oznaczone jako tak Sprawdzanie bazy danych Sql w usłudze Databricks oznaczone jako tak Databricks Runtime 18.2 lub nowszej

    Zwraca, 1 gdy instrukcja jest uruchamiana wewnątrz niepodzielnej instrukcji złożonej (BEGIN ATOMIC ... END); w przeciwnym razie zwraca wartość 0. variable_name musi być elementem INT.

    Instrukcje niepodzielne złożone zapewniają te same semantyka transakcyjna z wieloma instrukcjami co transakcje interakcyjne; zobacz BEGIN ATOMIC , aby zapoznać się z otaczającym zakresem.

  • ROW_COUNT

    Dotyczy:sprawdź, czy zaznaczono tak, sprawdź, czy usługa SQL databricks została oznaczona jako tak Databricks Runtime 18 LTS lub nowsza

    Note

    Środowisko Databricks Runtime 18 jest nowsze niż środowisko Databricks Runtime 18.0, 18.1 i 18.2. Funkcje, które wcześniej były dostarczane jako nowsza numerowana wersja, są teraz dostarczane jako daty aktualizacji środowiska Databricks Runtime 18 zamiast. Aby uzyskać szczegółowe informacje, zobacz Informacje o ujednoliconej wersji.

    Zwraca liczbę wierszy, których dotyczy ostatnio wykonana instrukcja DML jako BIGINT. variable_name musi być BIGINT.

    Zwraca wartość NULL , gdy:

    • Żadna instrukcja nie została jeszcze wykonana w otaczającej złożonej treści.
    • Najnowsza instrukcja nie jest instrukcją DML (na przykład SELECT, DDL lub SET VAR).
    • Najnowsza instrukcja DML nie zgłasza liczby wierszy, których dotyczy problem. Wbudowane zapisy usługi Delta Lake (INSERT, UPDATE, DELETE, MERGE INTOi COPY INTO) wypełniają wartość ROW_COUNT. Operacje zapisu w tabelach innych niż delta i zapisy są zwracane za pośrednictwem NULL.
    • Wprowadzono procedurę obsługi. Każda instrukcja resetuje ROW_COUNT się przed jego uruchomieniem, więc program obsługi wyjątków NULLzawsze obserwuje .
    • Zwraca instrukcję CALL . Powrót z procedury resetuje ROW_COUNT się w obiekcie wywołującym, więc obiekt wywołujący nie może obserwować wykonywania DML wewnątrz wywołania.

    Co najwyżej jedna zmienna na GET DIAGNOSTICS instrukcję może być przypisana z ROW_COUNT. Połącz z elementem , TRANSACTION_ACTIVE dodając więcej przypisań do tej samej instrukcji.

    Aby przechwycić liczbę wierszy, których dotyczy problem, umieść bezpośrednio GET DIAGNOSTICS ... = ROW_COUNT po instrukcji DML. Zagnieżdżony BEGIN ... END blok nie ukrywa kodu DML bloku zewnętrznego (wartość pozostaje widoczna w zagnieżdżonych ciałach złożonych), ale wszelkie pośredniczące instrukcje inne niż DML lub CALL czyści gniazdo.

Przykłady

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