GET DIAGNOSTICS ifadesi

Şunun için geçerlidir:evet olarak işaretlendi Databricks SQL evet olarak işaretlendi Databricks Runtime 16.3 ve üzeri

Özel durum işleyicisinde işlenen bir koşul, etkin işlem durumu veya en son DML deyiminden etkilenen satır sayısı hakkındaki bilgileri alır.

Form CONDITION yalnızca bileşik deyimdeki bir koşul işleyicisi içinde kullanılabilir. Form TRANSACTION_ACTIVE tek başına SQL deyimi olarak veya bileşik deyimi içinde kullanılabilir. Form ROW_COUNT yalnızca bir SQL saklı yordamının gövdesi de dahil olmak üzere bileşik deyim içinde kullanılabilir.

Sözdizimi

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 }

Parametreler

  • variable_name

    Yerel değişken veya oturum değişkeni.

  • CONDITION

    Koşul işleyicisini tetikleyen koşulu döndürür. İşleyicideki ilk deyim olarak vermelisiniz GET DIAGNOSTICS CONDITION 1 .

    • MESSAGE_TEXT

      Koşulla ilişkili ileti metnini STRINGolarak döndürür. variable_name bir STRINGolmalıdır.

    • RETURNED_SQLSTATE

      İşlenen koşulla ilişkili olan SQLSTATESTRINGolarak döndürür. variable_name bir STRINGolmalıdır.

    • MESSAGE_ARGUMENTS

      Databricks koşullarının parametrelerine, bağımsız değişken olarak sağlanan bir MAP<STRING, STRING> eşlemesini döndürür. Bildirilen koşullar için tek harita anahtarı MESSAGE_TEXT. variable_name bir MAP<STRING, STRING> olmalıdır

    • CONDITION_IDENTIFIER

      Özel duruma neden olan koşul adını döndürür. variable_name bir STRINGolmalıdır.

    • LINE_NUMBER

      Koşulu tetikleyen deyimin satır numarasını döndürür. Eğer mevcut değilse, NULL.

  • TRANSACTION_ACTIVE

    Şunun için geçerlidir:evet olarak işaretlendi Databricks SQL denetimi evet olarak işaretlendi Databricks Runtime 18.2 ve üzeri

    deyimi bir atomik bileşik deyimi (1) içinde çalıştığında döndürürBEGIN ATOMIC ... END; aksi takdirde döndürür0. variable_name bir INTolmalıdır.

    Atomik bileşik deyimler , etkileşimli işlemler ile aynı çok deyimli işlem semantiğini sağlar; çevresindeki kapsam için bkz BEGIN ATOMIC .

  • ROW_COUNT

    Şunun için geçerlidir:evet olarak işaretlendi Databricks SQL denetimi evet olarak işaretlendi Databricks Runtime 18 LTS ve üzeri

    Note

    Databricks Runtime 18, Databricks Runtime 18.0, 18.1 ve 18.2'den daha yenidir. Daha önce daha sonra numaralandırılmış sürüm olarak gönderilecek özellikler artık databricks Runtime 18'e tarihli güncelleştirmeler olarak gönderilir. Ayrıntılar için bkz. Birleşik sürüm notları hakkında.

    En son yürütülen DML deyiminden etkilenen satır sayısını olarak BIGINTdöndürür. variable_name bir BIGINTolmalıdır.

    Şunun sonucunu verir NULL :

    • Henüz kapsayan bileşik gövdede hiçbir deyim yürütülmedi.
    • En son deyim bir DML deyimi değildir (örneğin, , SELECTDDL veya SET VAR).
    • En son DML deyimi, etkilenen satır sayısını raporlamaz. Yerleşik Delta Lake yazma işlemleri (INSERT, UPDATE, DELETE, MERGE INTOve COPY INTO) doldurur ROW_COUNT. Delta olmayan tablolara yazar ve Apache Spark veri kaynağı V2 katalogları aracılığıyla yazma işlemleri döndürür NULL.
    • İşleyici girilir. Her deyim çalışmadan önce sıfırlanır ROW_COUNT , bu nedenle bir özel durum işleyicisi her zaman öğesini gözlemler NULL.
    • Deyimi CALL döndürülüyor. Bir yordamdan döndürülürken çağıran içinde sıfırlanır ROW_COUNT , böylece çağıran arayan içinde yürütülen DML'yi gözlemleyemez.

    deyimi başına GET DIAGNOSTICS en fazla bir değişken adresinden ROW_COUNTatanabilir. Aynı deyime daha fazla atama ekleyerek ile birleştirin TRANSACTION_ACTIVE .

    Etkilenen satır sayısını yakalamak için DML deyiminin hemen arkasına yerleştirin GET DIAGNOSTICS ... = ROW_COUNT . İç içe geçmiş BEGIN ... END bir blok, dış bloğun DML'sini gizlemez (değer iç içe bileşik gövdeler arasında görünür durumda kalır), ancak DML olmayan herhangi bir deyimini engeller veya CALL yuvayı temizler.

Örnekler

-- 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.