Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à :
Databricks SQL
Databricks Runtime 16.3 et versions ultérieures
Récupère des informations sur une condition gérée dans un gestionnaire d’exceptions, l’état de transaction actif ou le nombre de lignes affectées par l’instruction DML la plus récente.
Le CONDITION formulaire peut uniquement être utilisé dans un gestionnaire de conditions dans une instruction composée.
Le TRANSACTION_ACTIVE formulaire peut être utilisé comme instruction SQL autonome ou à l’intérieur d’une instruction composée.
Le ROW_COUNT formulaire peut uniquement être utilisé dans une instruction composée, y compris le corps d’une procédure stockée SQL.
Syntaxe
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 }
Paramètres
-
Variable locale ou variable de session.
CONDITIONRetourne la condition qui a déclenché le gestionnaire de conditions. Vous devez émettre
GET DIAGNOSTICS CONDITION 1comme première instruction dans le gestionnaire.MESSAGE_TEXTRetourne le texte du message associé à la condition en tant que
STRING.variable_namedoit être de typeSTRING.RETURNED_SQLSTATERetourne le
SQLSTATEassocié à la condition traitée en tant queSTRING.variable_namedoit être de typeSTRING.MESSAGE_ARGUMENTSRetourne un mappage
MAP<STRING, STRING>fourni sous forme d’arguments pour les paramètres des conditions Databricks. Pour les conditions déclarées, la seule clé de mappage estMESSAGE_TEXT.variable_namedoit être de typeMAP<STRING, STRING>.CONDITION_IDENTIFIERRetourne le nom de la condition qui a provoqué l’exception.
variable_namedoit être de typeSTRING.LINE_NUMBERRetourne le numéro de ligne de l’instruction qui déclenche la condition.
NULLsi non disponible.
TRANSACTION_ACTIVES’applique à :
Databricks SQL
Databricks Runtime 18.2 et versions ultérieuresRetourne
1lorsque l’instruction s’exécute à l’intérieur d’une instruction composée atomique (BEGIN ATOMIC ... END) ; sinon retourne0.variable_namedoit être unINT.Les instructions composées atomiques fournissent la même sémantique transactionnelle à plusieurs instructions que les transactions interactives ; voir
BEGIN ATOMICpour l’étendue environnante.ROW_COUNTS’applique à :
Databricks SQL
Databricks Runtime 18 LTS et versions ultérieuresRemarque
Databricks Runtime 18 est plus récent que Databricks Runtime 18.0, 18.1 et 18.2. Les fonctionnalités qui auraient précédemment été livrées sous la forme d’une version numérotée ultérieure sont désormais fournies sous forme de mises à jour databricks Runtime 18 à la place. Pour plus d’informations, consultez À propos des notes de publication unifiées.
Retourne le nombre de lignes affectées par l’instruction DML la plus récente exécutée en tant que
BIGINT.variable_namedoit être de typeBIGINT.Retourne
NULLquand :- Aucune instruction n’a encore été exécutée dans le corps composé englobant.
- L’instruction la plus récente n’est pas une instruction DML (par exemple, un ,
SELECTouSET VAR). - L’instruction DML la plus récente ne signale pas de nombre de lignes affectées. Écritures Delta Lake intégrées (
INSERT, ,UPDATEDELETE,MERGE INTOetCOPY INTO) remplissentROW_COUNT. Les écritures dans des tables non delta et les écritures par le biais de catalogues V2 de source de données Apache Spark retournentNULL. - Le gestionnaire est entré. Chaque instruction est réinitialisée
ROW_COUNTavant son exécution, de sorte qu’un gestionnaire d’exceptions observeNULLtoujours . - Une
CALLinstruction retourne. Retour d’une procédure réinitialiséeROW_COUNTdans l’appelant, de sorte que l’appelant ne peut pas observer DML exécuté à l’intérieur de l’appelé.
Au plus une variable par
GET DIAGNOSTICSinstruction peut être affectée à partir deROW_COUNT. Combinez-les enTRANSACTION_ACTIVEajoutant d’autres affectations à la même instruction.Pour capturer le nombre de lignes affectées, placez
GET DIAGNOSTICS ... = ROW_COUNTimmédiatement après l’instruction DML. Un bloc imbriquéBEGIN ... ENDne masque pas la DML du bloc externe (la valeur reste visible sur les corps composés imbriqués), mais toute instruction non-DML inter-DML ouCALLefface l’emplacement.
Exemples
-- 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.