Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:
Databricks SQL
Databricks Runtime 16.3 und höher
Ruft Informationen zu einer Bedingung ab, die in einem Ausnahmehandler, dem Status der aktiven Transaktion oder der Anzahl der Zeilen behandelt wird, die von der letzten DML-Anweisung betroffen sind.
Das CONDITION Formular kann nur innerhalb eines Bedingungshandlers in einer zusammengesetzten Anweisung verwendet werden.
Das TRANSACTION_ACTIVE Formular kann als eigenständige SQL-Anweisung oder in einer Verbund-Anweisung verwendet werden.
Das ROW_COUNT Formular kann nur in einer zusammengesetzten Anweisung verwendet werden, einschließlich des Textkörpers einer gespeicherten SQL-Prozedur.
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 }
Die Parameter
-
Eine lokale Variable oder Sitzungsvariable.
CONDITIONGibt die Bedingung zurück, die den Bedingungshandler ausgelöst hat. Sie müssen als erste Anweisung im Handler ausstellen
GET DIAGNOSTICS CONDITION 1.MESSAGE_TEXTGibt den Meldungstext, der der Bedingung zugeordnet ist, als zurück
STRING.variable_namemuss vom TypSTRINGsein.RETURNED_SQLSTATEGibt die zugehörige Bedingung zurück, die
SQLSTATEalsSTRING.variable_namemuss vom TypSTRINGsein.MESSAGE_ARGUMENTSGibt eine
MAP<STRING, STRING>Zuordnung zurück, die als Argumente für die Parameter von Databricks-Bedingungen bereitgestellt wird. Für deklarierte Bedingungen istMESSAGE_TEXTder einzige Zuordnungsschlüssel .variable_namemuss einMAP<STRING, STRING>CONDITION_IDENTIFIERGibt den Bedingungsnamen zurück, der die Ausnahme verursacht hat.
variable_namemuss vom TypSTRINGsein.LINE_NUMBERGibt die Zeilennummer der Anweisung zurück, die die Bedingung auslöst.
NULLfalls nicht verfügbar.
TRANSACTION_ACTIVEGilt für:
Databricks SQL
Databricks Runtime 18.2 and aboveGibt zurück
1, wenn die Anweisung innerhalb einer atomverbundenen Anweisung (BEGIN ATOMIC ... END); andernfalls wird zurückgegeben0.variable_namemuss einINT.Atomic compound statements provide the same multi-statement transactional semantics as interactive transactions; siehe
BEGIN ATOMICden umgebenden Bereich.ROW_COUNTGilt für:
Databricks SQL
Databricks Runtime 18.3 and aboveGibt die Anzahl der Zeilen zurück, die von der zuletzt ausgeführten DML-Anweisung als eine
BIGINT.variable_namemuss vom TypBIGINTsein.Gibt zurück
NULL, wenn:- Im eingeschlossenen zusammengesetzten Textkörper wurde noch keine Anweisung ausgeführt.
- Die neueste Anweisung ist keine DML-Anweisung (z. B. eine
SELECT, DDL oderSET VAR). - Die letzte DML-Anweisung meldet keine Anzahl betroffener Zeilen. Integrierte Delta Lake-Schreibvorgänge (
INSERT,UPDATE, ,DELETEMERGE INTOundCOPY INTO) füllenROW_COUNT. Schreibt in Nicht-Delta-Tabellen und schreibt über Apache Spark-Datenquellen-V2-Kataloge zurückNULL. - Der Handler wird eingegeben. Jede Anweisung wird zurückgesetzt
ROW_COUNT, bevor sie ausgeführt wird, sodass ein Ausnahmehandler immer beobachtet wirdNULL. - Eine
CALLAnweisung gibt zurück. Das Zurückgeben von einer Prozedur wird im Aufrufer zurückgesetztROW_COUNT, sodass der Aufrufer keine DML beobachten kann, die innerhalb des Angerufenen ausgeführt wird.
Es kann höchstens eine Variable pro
GET DIAGNOSTICSAnweisung zugewiesenROW_COUNTwerden. Kombinieren Sie diese Kombination,TRANSACTION_ACTIVEindem Sie der gleichen Anweisung weitere Zuordnungen hinzufügen.Wenn Sie die Anzahl betroffener Zeilen erfassen möchten, platzieren Sie sie
GET DIAGNOSTICS ... = ROW_COUNTunmittelbar hinter der DML-Anweisung. Ein geschachtelterBEGIN ... ENDBlock blendet die DML des äußeren Blocks nicht aus (der Wert bleibt über geschachtelte Verbundkörper sichtbar), aber alle dazwischen liegenden Nicht-DML-Anweisung oderCALLlöscht den Steckplatz.
Beispiele
-- 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.