BEGIN END bileşik deyimi

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

SQL deyimleri dizisi, akış denetimi deyimleri, yerel değişken bildirimleri ve özel durum işleyicileri içerebilen bir SQL Betiği bloğu uygular. ATOMIC olarak işaretlendiğinde, blok tüm ifadelerin eş zamanlı başarılı olduğu veya başarısız olduğu bir işlem birimi olarak çalışır.

Not

Bir not defterinden bileşik deyim çağrılırken hücredeki tek deyim olmalıdır.

Sözdizimi

[ label : ]
      BEGIN [ ATOMIC ]
      [ { declare_variable | declare_condition } ; [...] ]
      [ declare_cursor ; [...] ]
      [ declare_handler ; [...] ]
      [ SQL_statement ; [...] ]
      END [ label ]

declare_variable
  DECLARE variable_name [, ...] datatype [ DEFAULT default_expr ]

declare_condition
  DECLARE condition_name CONDITION [ FOR SQLSTATE [ VALUE ] sqlstate ]

declare_cursor
  DECLARE cursor_name [ ASENSITIVE | INSENSITIVE ] CURSOR FOR query [ FOR READ ONLY ]

declare_handler
  DECLARE handler_type HANDLER FOR condition_values handler_action

handler_type
  EXIT | CONTINUE

condition_values
 { { SQLSTATE [ VALUE ] sqlstate | condition_name } [, ...] |
   { SQLEXCEPTION | NOT FOUND } [, ...] }

Databricks Runtime 17.2'nin öncesinde tek seferde yalnızca bir değişken bildirebilirsiniz.

Parametre

  • etiket

    İsteğe bağlı bir tanımlayıcı, bileşik içinde tanımlanan değişkenleri niteleyip bileşikte bırakmak için kullanılır. Her iki etiket oluşumu da uyumlu olmalıdır ve END etiketi yalnızca label: etiketi belirtildiğinde belirtilebilir.

    etiket , en üst düzey bileşik deyim veya bileşik deyim için ATOMIC belirtilmemelidir.

  • ATOMIC

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

    Önemli

    ATOMIC bileşik deyimleri Genel Önizleme aşamasındadır.

    Bileşik ifadeyi atomik bir işlem bloğu olarak tanımlar. Bloktaki tüm deyimler tek bir işlem birimi olarak çalışır: tüm deyimler birlikte başarılı olur veya herhangi bir deyim başarısız olursa tüm değişiklikler geri alınır. Azure Databricks blok başarıyla tamamlandığında değişiklikleri otomatik olarak işler veya herhangi bir deyim başarısız olursa tüm değişiklikleri geri alır.

    Atomik bloklar, açık etkileşimli işlemler ile aynı yalıtım, görünürlük, hata işleme ve sınır semantiği sağlar. Ancak atomik bloklar, otomatik işleme ve geri alma davranışıyla daha basit söz dizimi sunar.

    Blok BEGIN ATOMIC ... END girildiğinde örtük olarak bir işlem başlatılır. Başarılı tamamlama işlemi örtük olarak işlemi işler. Hatalar, işlemin otomatik olarak durdurulmasına ve geri alınmasına neden olur.

    Not

    Çok tablolu işlemler için Databricks Runtime 18.0 ve üzerini ve katalog işlemelerinin tüm tablolarda etkinleştirilmesi gerekir. Tek tablolu atomik işlemler, ek gereksinimler olmadan Databricks Runtime 17.0 ve üzerinde çalışır.

    Aşağıdaki kısıtlamalar atomik bileşik deyimler için geçerlidir:

    • BEGIN ATOMIC ... END bloklar diğer atomik bloklar içinde çağrılabilir. İç blok dış işleme düzleştirilir. Tüm deyimler tek bir daha büyük işlemin parçası olarak çalışır. Bu iç içe yerleştirilmiş bir işlem değildir. Atomik blok, atomik BEGIN ... END olmayan bir blok içeremez.
    • Atomik bloklar, atomik BEGIN ... END olmayan bloklar içinde iç içe yerleştirilemez.
    • Özel durum işleyicilerine (DECLARE ... HANDLER) atomik bloklar içinde izin verilmez.
    • Atomik bloklar özel durum işleyicileri içinde tanımlanamaz.
    • Atomik bloklar içinde yalnızca DML işlemlerine (INSERT, UPDATE, DELETE), MERGESELECT deyimlerine, değişken bildirimlerine ve atamalarına, denetim akışı deyimlerine (IF, SIGNALve benzeri) ve atomik saklı yordamlara çağrılara izin verilir. DDL deyimleri ve diğer işlemler desteklenmez.
    • Yerel veya oturum değişkenlerinin ayarlanması işlemsel değildir. Yani, değişken atamaları işlem hatasında geri alınmaya tabi değildir.

    Bkz. Etkileşimli olmayan işlemler.

  • NOT ATOMIC

    Bileşik içindeki bir SQL deyimi başarısız olursa önceki SQL deyimlerinin geri alınmayacaklarını belirtir. Bu, belirtilmediğinde ATOMIC varsayılan davranıştır.

  • declare_variable

    Bir veya daha fazla değişken için yerel değişken bildirimi

    • variable_name

      Değişkenin adı. Ad, sıfatlarla nitelendirilmemeli ve bileşik deyim içinde benzersiz olmalıdır.

    • data_type

      Desteklenen herhangi bir veri türü. data_type atlanırsa, DEFAULT belirtmeniz gerekir ve tür değeri default_expression'dan alınır.

    • { DEFAULT | = } default_expression

      Bildiriminden sonra değişkenin ilk değerini tanımlar. default_expression, data_type'a dönüştürülebilir olmalıdır. Varsayılan belirtilmezse, değişken NULL ile başlatılır.

  • Declare_condition

    Yerel koşul bildirimi

    • condition_name

      Koşulun nitelenmemiş adı bileşik deyimi kapsamındadır.

    • sqlstate

      A-Z ve 0-9 içeren, büyük/küçük harfe duyarsız 5 alfasayısal karakterden oluşan bir STRING sabit değeridir. SQLSTATE '00', '01' veya 'XX' ile başlamamalıdır. '02' ile başlayan tüm SQLSTATE'ler de önceden tanımlanmış NOT FOUND özel durumu tarafından yakalanacaktır. Belirtilmezse, SQLSTATE '45000' olur.

  • declare_cursor

    Şunun için geçerlidir:evet olarak işaretlendi Databricks Runtime 18.1 ve üzerini denetleyin

    Sorgu sonuçlarında yineleme için yerel imleç bildirimi.

    Not

    için DECLARE CURSORyalnızca söz dizimi hataları algılanıp oluşturulur. İmleç OPEN ile açılana kadar sorgu yürütülür.

    • cursor_name: İmleç için nitelenmemiş, bu bileşik deyimdeki imleçler arasında benzersiz bir ad. OPEN, FETCH veya CLOSE içinde imlece başvururken, iç içe yerleştirilmiş kapsamlarda belirsizliği sağlamak için imleç adını bileşik deyim etiketiyle (örneğin, label.my_cursor) niteleyebilirsiniz.
    • ASENSITIVE | INSENSITIVE: İsteğe bağlı. İmleç açıldıktan sonra sonuç kümesi DML değişikliklerini etkilemez. Bu, varsayılan ve yalnızca desteklenen davranıştır.
    • query: İmleci tanımlayan sorgu ; imleç OPEN ile açıldığında yürütülür.
  • declare_handler

    Hata işleyicisi bildirimi.

    • handler_type

      • EXIT

        Koşul işlendikten sonra bileşik deyiminden çıkmak için işleyiciyi sınıflandırır. Bileşik deyim ve iç içe bileşik deyimler içinde açılan tüm imleçler örtük olarak kapatılır.

      • CONTINUE

        Şunun için geçerlidir:evet olarak işaretlendi Databricks Runtime 18.1 ve üzerini denetleyin

        İşleyici tamamlandıktan sonra yürütmeye devam etmek için işleyiciyi sınıflandırır. Yürütme, koşulu oluşturanın ardından deyimiyle devam eder.

    • condition_values

      İşleyicinin hangi SQL durumlarına veya koşullara uygulanacağını belirtir. Koşul değerleri bileşik deyimindeki tüm işleyiciler içinde benzersiz olmalıdır. Belirli koşul değerleri SQLEXCEPTION'dan daha önceliklidir.

    • sqlstate

      STRING ve 'A'-'Z' (büyük/küçük harfe duyarsız) olan 5 karakterlik '0'-'9' ifadesi.

    • condition_name

      Bu bileşik içinde tanımlanan bir koşul, dış bileşik deyim veya sistem tanımlı bir hata sınıfı.

    • SQLEXCEPTION

      Kullanıcıya yönelik herhangi bir hata koşulu için geçerlidir.

    • NOT FOUND

      bir imleç sonuç kümesinin sonuna getirildiğinde tetiklenen CURSOR_NO_MORE_ROWS koşulu (SQLSTATE ) dahil olmak üzere SQLSTATE '02000''02' sınıfına sahip herhangi bir hata koşulu için geçerlidir.

    • handler_action

      Koşul değerlerinden herhangi biri gerçekleştiğinde yürütülecek bir SQL deyimi. Birden çok deyim eklemek için iç içe yerleştirilmiş bileşik deyimi kullanın.

  • SQL_statement

    DDL, DML, denetim deyimi veya bileşik deyim gibi bir SQL deyimi. Herhangi bir SELECT veya VALUES deyimi, çağıranın kullanabileceği bir sonuç kümesi oluşturur.

Örnekler

Özel durum işleyicisi ile atomik olmayan bileşik deyim

-- A compound statement with local variables, exit handler, and nested compound
> BEGIN
    DECLARE a INT DEFAULT 1;
    DECLARE b INT DEFAULT 5;
    DECLARE EXIT HANDLER FOR DIVIDE_BY_ZERO
      div0: BEGIN
        VALUES (15);
      END div0;
    SET a = 10;
    SET a = b / 0;
    VALUES (a);
END;
15

Atomik bileşik deyimi

-- An atomic compound statement that ensures all changes commit together
> BEGIN ATOMIC
    INSERT INTO accounts VALUES (1, 'Alice', 1000);
    INSERT INTO accounts VALUES (2, 'Bob', 2000);
    UPDATE accounts SET balance = balance + 100 WHERE id = 1;
END;

Otomatik geri alma ile atomik bileşik deyimi

-- If any statement fails, all changes are rolled back automatically
> BEGIN ATOMIC
    INSERT INTO orders VALUES (101, 'Product A', 50.00);
    UPDATE inventory SET quantity = quantity - 1 WHERE product = 'Product A';
    -- If this statement fails, both the INSERT and UPDATE are rolled back
    INSERT INTO audit_log VALUES (101, current_timestamp(), 1/0);
END;
-- Error: Division by zero
-- All changes rolled back automatically

Değişkenlerle atomik bileşik deyimi

-- Variables can be used within atomic blocks
> BEGIN ATOMIC
    DECLARE total_amount DECIMAL(10, 2);

    INSERT INTO sales VALUES (301, 150.00, current_date());

    SET total_amount = (SELECT SUM(amount) FROM sales WHERE sale_date = current_date());

    UPDATE daily_summary SET total = total_amount WHERE summary_date = current_date();
END;