Pernyataan gabungan BEGIN END

Berlaku untuk:ditandai cek ya Databricks SQL ditandai cek ya Databricks Runtime 16.3 ke atas

Menerapkan blok Skrip SQL yang dapat berisi urutan pernyataan SQL, pernyataan kontrol aliran, deklarasi variabel lokal, dan penangan pengecualian. Ketika ditandai sebagai ATOMIC, blok berjalan sebagai unit transaksional di mana semua pernyataan berhasil bersama-sama atau gagal bersama-sama.

Nota

Saat memanggil pernyataan gabungan dari buku catatan, itu harus menjadi satu-satunya pernyataan dalam sel.

Sintaksis

[ 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 } [, ...] }

Sebelum Databricks Runtime 17.2 Anda hanya dapat mendeklarasikan satu variabel pada satu waktu.

Parameter

  • label

    Pengidentifikasi opsional digunakan untuk memenuhi syarat variabel yang ditentukan dalam senyawa dan untuk meninggalkan senyawa. Kedua kemunculan label harus cocok, dan label END hanya dapat ditentukan jika label: ditentukan.

    label tidak boleh ditentukan untuk pernyataan gabungan tingkat atas atau untuk ATOMIC pernyataan gabungan.

  • ATOMIC

    Berlaku untuk:Ditandai dengan ya Databricks SQL Ditandai dengan ya Databricks Runtime 17.0 ke atas

    Penting

    Pernyataan gabungan ATOMIC ada di Pratinjau Umum.

    Menandai pernyataan majemuk sebagai blok transaksi atom. Semua pernyataan dalam blok berjalan sebagai satu unit transaksional—baik semua pernyataan berhasil bersama-sama, atau semua perubahan digulung balik jika ada pernyataan yang gagal. Azure Databricks secara otomatis menerapkan perubahan ketika blok berhasil diselesaikan, atau mengembalikan semua perubahan jika ada pernyataan yang gagal.

    Blok atom menyediakan isolasi, visibilitas, penanganan kesalahan, dan semantik batas yang sama seperti transaksi interaktif eksplisit. Namun, blok atom menawarkan sintaks yang lebih sederhana dengan perilaku penerapan dan putar kembali otomatis.

    Memasukkan BEGIN ATOMIC ... END blok secara implisit memulai transaksi. Penyelesaian yang berhasil secara implisit melakukan transaksi. Kesalahan menyebabkan transaksi dibatalkan dan digulung balik secara otomatis.

    Nota

    Transaksi multi-tabel memerlukan Databricks Runtime 18.0 ke atas dan penerapan katalog diaktifkan pada semua tabel. Transaksi atom tabel tunggal berfungsi di Databricks Runtime 17.0 ke atas tanpa persyaratan tambahan.

    Pembatasan berikut berlaku untuk pernyataan senyawa atom:

    • BEGIN ATOMIC ... END blok dapat dipanggil dalam blok atom lainnya. Blok dalam diratakan ke dalam transaksi luar—semua pernyataan berjalan sebagai bagian dari satu transaksi yang lebih besar. Ini bukan transaksi berlapis. Blok atom tidak boleh berisi blok non-atomik BEGIN ... END .
    • Blok atom tidak dapat disarangkan dalam blok non-atomik BEGIN ... END .
    • Penangan pengecualian (DECLARE ... HANDLER) tidak diizinkan dalam blok atom.
    • Blok atom tidak dapat didefinisikan dalam handler pengecualian.
    • Hanya operasi DML (INSERT, , UPDATE, DELETEMERGE), SELECT pernyataan, deklarasi variabel dan penugasan, pernyataan aliran kontrol (IF, SIGNAL, dan serupa), dan panggilan ke prosedur tersimpan atom yang diizinkan dalam blok atomik. Pernyataan DDL dan operasi lainnya tidak didukung.
    • Pengaturan variabel lokal atau sesi bersifat non-transaksi. Artinya, penetapan variabel tidak dapat digulung balik pada kegagalan transaksi.

    Lihat Transaksi non-interaktif.

  • NOT ATOMIC

    Menentukan bahwa, jika pernyataan SQL dalam senyawa gagal, pernyataan SQL sebelumnya tidak akan digulung balik. Ini adalah perilaku default ketika ATOMIC tidak ditentukan.

  • declare_variable

    Deklarasi variabel lokal untuk satu atau beberapa variabel

    • variable_name

      Nama untuk variabel. Nama tidak boleh berkualifikasi dan harus unik dalam pernyataan majemuk.

    • data_type

      Jenis data apa pun yang didukung. Jika data_type dihilangkan, Anda harus menentukan DEFAULT, dan jenisnya berasal dari default_expression.

    • { DEFAULT | = } default_expression

      Menentukan nilai awal variabel setelah deklarasi. default_expression harus dapat dikonversi ke data_type. Jika tidak ada default yang ditentukan, variabel diinisialisasi dengan NULL.

  • Declare_condition

    Deklarasi kondisi lokal

    • condition_name

      Nama kondisi yang tidak memenuhi syarat dilingkup ke pernyataan majemuk.

    • sqlstate

      STRING harfiah 5 karakter alfanumerik (tidak peka huruf besar/kecil) yang terdiri dari A-Z dan 0,.9. SQLSTATE tidak boleh dimulai dengan '00', '01', atau 'XX'. Setiap SQLSTATE yang dimulai dengan '02' juga akan ditangkap oleh pengecualian NOT FOUND yang telah ditentukan sebelumnya. Jika tidak ditentukan, SQLSTATE adalah '45000'.

  • declare_cursor

    Berlaku untuk:check ditandai ya Databricks Runtime 18.1 ke atas

    Deklarasi kursor lokal untuk iterasi melalui hasil kueri.

    Nota

    Untuk DECLARE CURSOR, hanya kesalahan sintaks yang terdeteksi dan dinaikkan. Kueri tidak dijalankan sampai kursor dibuka dengan OPEN.

    • cursor_name: Nama yang tidak memenuhi syarat untuk kursor, unik di antara kursor dalam pernyataan majemuk ini. Saat mereferensikan kursor di OPEN, FETCH, atau CLOSE, Anda dapat memenuhi syarat nama kursor dengan label pernyataan campuran (misalnya, label.my_cursor) untuk membedakan dalam cakupan berlapis.
    • ASENSITIVE | INSENSITIVE: Opsional. Setelah kursor dibuka, kumpulan hasil tidak terpengaruh oleh perubahan DML. Ini adalah perilaku default dan hanya didukung.
    • kueri: Kueri yang menentukan kursor; ini dijalankan ketika kursor dibuka dengan OPEN.
  • declare_handler

    Deklarasi untuk penanganan kesalahan.

    • handler_type

      • EXIT

        Mengklasifikasikan handler untuk keluar dari pernyataan senyawa setelah kondisi ditangani. Semua kursor yang dibuka dalam pernyataan gabungan dan pernyataan senyawa berlapis ditutup secara implisit.

      • CONTINUE

        Berlaku untuk:check ditandai ya Databricks Runtime 18.1 ke atas

        Mengklasifikasikan handler untuk melanjutkan eksekusi setelah handler selesai. Eksekusi dilanjutkan dengan pernyataan setelah yang menaikkan kondisi.

    • condition_values

      Menentukan sqlstates atau kondisi mana yang diterapkan oleh handler. Nilai kondisi harus unik untuk setiap handler di dalam pernyataan gabungan. Nilai kondisi tertentu lebih diutamakan daripada SQLEXCEPTION.

    • sqlstate

      Harfiah STRING 5 karakter 'A'-'Z' dan '0'-'9' (tidak peka huruf besar/kecil).

    • condition_name

      Kondisi yang ditentukan dalam senyawa ini, pernyataan senyawa luar, atau kelas kesalahan yang ditentukan sistem.

    • SQLEXCEPTION

      Berlaku untuk kondisi kesalahan yang dihadapi pengguna.

    • NOT FOUND

      Berlaku untuk kondisi kesalahan apa pun dengan kelas SQLSTATE '02', termasuk kondisi CURSOR_NO_MORE_ROWS (SQLSTATE '02000') yang dimunculkan saat mengambil di luar akhir kumpulan hasil kursor.

    • handler_action

      Pernyataan SQL untuk dijalankan ketika salah satu nilai kondisi terjadi. Untuk menambahkan beberapa pernyataan, gunakan pernyataan gabungan berlapis.

  • SQL_statement

    Pernyataan SQL seperti DDL, DML, pernyataan kontrol, atau pernyataan majemuk. Pernyataan SELECT atau VALUES apa pun menghasilkan tataan hasil yang dapat dikonsumsi oleh pemanggil.

Contoh

Pernyataan senyawa non-atomik dengan handler pengecualian

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

Pernyataan senyawa atom

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

Pernyataan senyawa atomik dengan putar kembali otomatis

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

Pernyataan senyawa atomik dengan variabel

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