Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunun için geçerlidir:
Databricks SQL
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
-
Yerel değişken veya oturum değişkeni.
CONDITIONKoşul işleyicisini tetikleyen koşulu döndürür. İşleyicideki ilk deyim olarak vermelisiniz
GET DIAGNOSTICS CONDITION 1.MESSAGE_TEXTKoşulla ilişkili ileti metnini
STRINGolarak döndürür.variable_namebirSTRINGolmalıdır.RETURNED_SQLSTATEİşlenen koşulla ilişkili olan
SQLSTATE'ıSTRINGolarak döndürür.variable_namebirSTRINGolmalıdır.MESSAGE_ARGUMENTSDatabricks 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_namebirMAP<STRING, STRING>olmalıdırCONDITION_IDENTIFIERÖzel duruma neden olan koşul adını döndürür.
variable_namebirSTRINGolmalıdır.LINE_NUMBERKoşulu tetikleyen deyimin satır numarasını döndürür. Eğer mevcut değilse,
NULL.
TRANSACTION_ACTIVEŞunun için geçerlidir:
Databricks SQL
Databricks Runtime 18.2 ve üzerideyimi bir atomik bileşik deyimi (
1) içinde çalıştığında döndürürBEGIN ATOMIC ... END; aksi takdirde döndürür0.variable_namebirINTolmalı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:
Databricks SQL
Databricks Runtime 18 LTS ve üzeriNote
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_namebirBIGINTolmalı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 veyaSET VAR). - En son DML deyimi, etkilenen satır sayısını raporlamaz. Yerleşik Delta Lake yazma işlemleri (
INSERT,UPDATE,DELETE,MERGE INTOveCOPY INTO) doldururROW_COUNT. Delta olmayan tablolara yazar ve Apache Spark veri kaynağı V2 katalogları aracılığıyla yazma işlemleri döndürürNULL. - İşleyici girilir. Her deyim çalışmadan önce sıfırlanır
ROW_COUNT, bu nedenle bir özel durum işleyicisi her zaman öğesini gözlemlerNULL. - Deyimi
CALLdöndürülüyor. Bir yordamdan döndürülürken çağıran içinde sıfırlanırROW_COUNT, böylece çağıran arayan içinde yürütülen DML'yi gözlemleyemez.
deyimi başına
GET DIAGNOSTICSen fazla bir değişken adresindenROW_COUNTatanabilir. Aynı deyime daha fazla atama ekleyerek ile birleştirinTRANSACTION_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 ... ENDbir 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 veyaCALLyuvayı 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.