GET istruzione DIAGNOSTICS

Si applica a:contrassegnato sì Databricks SQL contrassegnato sì Databricks Runtime 16.3 e versioni successive

Recupera informazioni su una condizione gestita in un gestore eccezioni, sullo stato della transazione attiva o sul numero di righe interessate dall'istruzione DML più recente.

Il CONDITION form può essere utilizzato solo all'interno di un gestore di condizioni in un'istruzione composta. Il TRANSACTION_ACTIVE modulo può essere usato come istruzione SQL autonoma o all'interno di un'istruzione composta. Il ROW_COUNT form può essere usato solo all'interno di un'istruzione composta, incluso il corpo di una stored procedure SQL.

Sintassi

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 }

Parametri

  • variable_name

    Variabile locale o variabile di sessione.

  • CONDITION

    Restituisce la condizione che ha attivato il gestore della condizione. È necessario eseguire GET DIAGNOSTICS CONDITION 1 come prima istruzione nel gestore.

    • MESSAGE_TEXT

      Restituisce il testo del messaggio associato alla condizione come STRING. variable_name deve essere un STRING.

    • RETURNED_SQLSTATE

      Restituisce il SQLSTATE associato alla condizione gestita come STRING. variable_name deve essere un STRING.

    • MESSAGE_ARGUMENTS

      Restituisce un mapping MAP<STRING, STRING> fornito come argomenti ai parametri delle condizioni di Databricks. Per le condizioni dichiarate, l'unica chiave della mappa è MESSAGE_TEXT. variable_name deve essere un MAP<STRING, STRING>

    • CONDITION_IDENTIFIER

      Restituisce il nome della condizione che ha causato l'eccezione. variable_name deve essere un STRING.

    • LINE_NUMBER

      Restituisce il numero di riga dell'istruzione che genera la condizione. NULL se non disponibile.

  • TRANSACTION_ACTIVE

    Si applica a:check contrassegnato come sì controllo SQL di Databricks contrassegnato come sì Databricks Runtime 18.2 e versioni successive

    Restituisce 1 quando l'istruzione viene eseguita all'interno di un'istruzione composta atomica (BEGIN ATOMIC ... END); in caso contrario, restituisce 0. variable_name deve essere un oggetto INT.

    Le istruzioni composte atomiche forniscono la stessa semantica transazionale con più istruzioni delle transazioni interattive; vedere BEGIN ATOMIC per l'ambito circostante.

  • ROW_COUNT

    Si applica a:check contrassegnato come sì controllo SQL di Databricks contrassegnato come sì Databricks Runtime 18.3 e versioni successive

    Restituisce il numero di righe interessate dall'istruzione DML eseguita più di recente come .BIGINT variable_name deve essere un BIGINT.

    Restituisce NULL quando:

    • Nessuna istruzione eseguita ancora nel corpo composto contenitore.
    • L'istruzione più recente non è un'istruzione DML, ad esempio , SELECTDDL o SET VAR.
    • L'istruzione DML più recente non segnala un conteggio delle righe interessato. Le scritture Delta Lake predefinite (INSERT, UPDATE, MERGE INTODELETE, e COPY INTO) popolano ROW_COUNT. Scrive in tabelle non Delta e scrive tramite cataloghi V2 dell'origine dati Apache Spark.NULL
    • Viene immesso il gestore. Ogni istruzione viene reimpostata ROW_COUNT prima dell'esecuzione, quindi un gestore eccezioni NULLosserva sempre .
    • Restituisce un'istruzione CALL . La restituzione da una procedura viene reimpostata ROW_COUNT nel chiamante, pertanto il chiamante non può osservare LML eseguito all'interno del chiamato.

    Al massimo una variabile per GET DIAGNOSTICS istruzione può essere assegnata da ROW_COUNT. Combinare con TRANSACTION_ACTIVE aggiungendo altre assegnazioni alla stessa istruzione.

    Per acquisire il conteggio delle righe interessate, posizionare GET DIAGNOSTICS ... = ROW_COUNT immediatamente dopo l'istruzione DML. Un blocco annidato non nasconde il DML del blocco esterno (il valore rimane visibile tra corpi composti annidati BEGIN ... END ), ma qualsiasi istruzione non DML intervene o CALL cancella lo slot.

Esempi

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