Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a:
Databricks SQL
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
-
Variabile locale o variabile di sessione.
CONDITIONRestituisce la condizione che ha attivato il gestore della condizione. È necessario eseguire
GET DIAGNOSTICS CONDITION 1come prima istruzione nel gestore.MESSAGE_TEXTRestituisce il testo del messaggio associato alla condizione come
STRING.variable_namedeve essere unSTRING.RETURNED_SQLSTATERestituisce il
SQLSTATEassociato alla condizione gestita comeSTRING.variable_namedeve essere unSTRING.MESSAGE_ARGUMENTSRestituisce 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_namedeve essere unMAP<STRING, STRING>CONDITION_IDENTIFIERRestituisce il nome della condizione che ha causato l'eccezione.
variable_namedeve essere unSTRING.LINE_NUMBERRestituisce il numero di riga dell'istruzione che genera la condizione.
NULLse non disponibile.
TRANSACTION_ACTIVESi applica a:
controllo SQL di Databricks
Databricks Runtime 18.2 e versioni successiveRestituisce
1quando l'istruzione viene eseguita all'interno di un'istruzione composta atomica (BEGIN ATOMIC ... END); in caso contrario, restituisce0.variable_namedeve essere un oggettoINT.Le istruzioni composte atomiche forniscono la stessa semantica transazionale con più istruzioni delle transazioni interattive; vedere
BEGIN ATOMICper l'ambito circostante.ROW_COUNTSi applica a:
controllo SQL di Databricks
Databricks Runtime 18.3 e versioni successiveRestituisce il numero di righe interessate dall'istruzione DML eseguita più di recente come .
BIGINTvariable_namedeve essere unBIGINT.Restituisce
NULLquando:- Nessuna istruzione eseguita ancora nel corpo composto contenitore.
- L'istruzione più recente non è un'istruzione DML, ad esempio ,
SELECTDDL oSET VAR. - L'istruzione DML più recente non segnala un conteggio delle righe interessato. Le scritture Delta Lake predefinite (
INSERT,UPDATE,MERGE INTODELETE, eCOPY INTO) popolanoROW_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_COUNTprima dell'esecuzione, quindi un gestore eccezioniNULLosserva sempre . - Restituisce un'istruzione
CALL. La restituzione da una procedura viene reimpostataROW_COUNTnel chiamante, pertanto il chiamante non può osservare LML eseguito all'interno del chiamato.
Al massimo una variabile per
GET DIAGNOSTICSistruzione può essere assegnata daROW_COUNT. Combinare conTRANSACTION_ACTIVEaggiungendo altre assegnazioni alla stessa istruzione.Per acquisire il conteggio delle righe interessate, posizionare
GET DIAGNOSTICS ... = ROW_COUNTimmediatamente dopo l'istruzione DML. Un blocco annidato non nasconde il DML del blocco esterno (il valore rimane visibile tra corpi composti annidatiBEGIN ... END), ma qualsiasi istruzione non DML intervene oCALLcancella 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.