Instruction GET DIAGNOSTICS

S’applique à :coché oui Databricks SQL coché oui 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_name

    Variable locale ou variable de session.

  • CONDITION

    Retourne la condition qui a déclenché le gestionnaire de conditions. Vous devez émettre GET DIAGNOSTICS CONDITION 1 comme première instruction dans le gestionnaire.

    • MESSAGE_TEXT

      Retourne le texte du message associé à la condition en tant que STRING. variable_name doit être de type STRING.

    • RETURNED_SQLSTATE

      Retourne le SQLSTATE associé à la condition traitée en tant que STRING. variable_name doit être de type STRING.

    • MESSAGE_ARGUMENTS

      Retourne 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 est MESSAGE_TEXT. variable_name doit être de type MAP<STRING, STRING>.

    • CONDITION_IDENTIFIER

      Retourne le nom de la condition qui a provoqué l’exception. variable_name doit être de type STRING.

    • LINE_NUMBER

      Retourne le numéro de ligne de l’instruction qui déclenche la condition. NULL si non disponible.

  • TRANSACTION_ACTIVE

    S’applique à :check marqué oui Databricks SQL vérifié marqué oui Databricks Runtime 18.2 et versions ultérieures

    Retourne 1 lorsque l’instruction s’exécute à l’intérieur d’une instruction composée atomique (BEGIN ATOMIC ... END) ; sinon retourne 0. variable_name doit être un INT.

    Les instructions composées atomiques fournissent la même sémantique transactionnelle à plusieurs instructions que les transactions interactives ; voir BEGIN ATOMIC pour l’étendue environnante.

  • ROW_COUNT

    S’applique à :check marqué oui Databricks SQL check marqué oui Databricks Runtime 18 LTS et versions ultérieures

    Remarque

    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_name doit être de type BIGINT.

    Retourne NULL quand :

    • 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 , SELECT ou SET 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 INTOet COPY INTO) remplissent ROW_COUNT. Les écritures dans des tables non delta et les écritures par le biais de catalogues V2 de source de données Apache Spark retournent NULL.
    • Le gestionnaire est entré. Chaque instruction est réinitialisée ROW_COUNT avant son exécution, de sorte qu’un gestionnaire d’exceptions observe NULLtoujours .
    • Une CALL instruction retourne. Retour d’une procédure réinitialisée ROW_COUNT dans 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 DIAGNOSTICS instruction peut être affectée à partir de ROW_COUNT. Combinez-les en TRANSACTION_ACTIVE ajoutant d’autres affectations à la même instruction.

    Pour capturer le nombre de lignes affectées, placez GET DIAGNOSTICS ... = ROW_COUNT immédiatement après l’instruction DML. Un bloc imbriqué BEGIN ... END ne 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 ou CALL efface 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.