Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:
Databricks SQL
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
-
En lokal variabel eller sessionsvariabel.
CONDITIONReturnerar villkoret som utlöste villkorshanteraren. Du måste utfärda
GET DIAGNOSTICS CONDITION 1som den första instruktionen i hanteraren.MESSAGE_TEXTReturnerar meddelandetexten som är associerad med villkoret som en
STRING.variable_namemåste vara enSTRING.RETURNED_SQLSTATEReturnerar
SQLSTATEsom är associerad med det villkor som hanteras som enSTRING.variable_namemåste vara enSTRING.MESSAGE_ARGUMENTSReturnerar en
MAP<STRING, STRING>-mappning som ges som argument till parametrarna för villkoren i Databricks. För deklarerade villkor är den enda kartnyckelnMESSAGE_TEXT.variable_namemåste vara enMAP<STRING, STRING>CONDITION_IDENTIFIERReturnerar villkorsnamnet som orsakade undantaget.
variable_namemåste vara enSTRING.LINE_NUMBERReturnerar radnumret för instruktionen som utlöser villkoret.
NULLom det inte är tillgängligt.
TRANSACTION_ACTIVEGäller för:
Databricks
Databricks Runtime 18.2 och senareReturnerar
1när -instruktionen körs i en atomisk sammansatt -instruktion (BEGIN ATOMIC ... END); annars returneras0.variable_namemåste vara enINT.Atomiska sammansatta uttryck ger samma transaktionssemantik med flera instruktioner som interaktiva transaktioner. se
BEGIN ATOMICför det omgivande omfånget.ROW_COUNTGäller för:
Databricks
Databricks Runtime 18 LTS och senareNote
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_namemåste vara enBIGINT.Returnerar
NULLnä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 ellerSET VAR). - Den senaste DML-instruktionen rapporterar inte ett antal berörda rader. Inbyggda Delta Lake-skrivningar (
INSERT, ,UPDATEDELETE,MERGE INTOochCOPY INTO) fyllerROW_COUNTi . Skrivningar till icke-Delta-tabeller och skrivningar via Apache Spark-datakällans V2-kataloger returnerarNULL. - Hanteraren har angetts. Varje instruktion återställs
ROW_COUNTinnan den körs, så en undantagshanterare observerarNULLalltid . - En
CALLinstruktion returnerar. När du återvänder från en procedur återställsROW_COUNTden som ringer, så att anroparen inte kan observera att DML körs i anroparen.
Högst en variabel per
GET DIAGNOSTICSinstruktion kan tilldelas frånROW_COUNT. Kombinera medTRANSACTION_ACTIVEgenom att lägga till fler tilldelningar i samma instruktion.Om du vill samla in antalet berörda rader placerar
GET DIAGNOSTICS ... = ROW_COUNTdu omedelbart efter DML-instruktionen. Ett kapslatBEGIN ... ENDblock döljer inte det yttre blockets DML (värdet förblir synligt över kapslade sammansatta kroppar), men alla mellanliggande icke-DML-uttryck ellerCALLrensar 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.