Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk:
Databricks SQL
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
-
Pengidentifikasi opsional digunakan untuk memenuhi syarat variabel yang ditentukan dalam senyawa dan untuk meninggalkan senyawa. Kedua kemunculan label harus cocok, dan label
ENDhanya dapat ditentukan jikalabel:ditentukan.label tidak boleh ditentukan untuk pernyataan gabungan tingkat atas atau untuk
ATOMICpernyataan gabungan. ATOMICBerlaku untuk:
Databricks SQL
Databricks Runtime 17.0 ke atasPenting
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 ... ENDblok 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 ... ENDblok 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-atomikBEGIN ... 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),SELECTpernyataan, 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 ATOMICMenentukan bahwa, jika pernyataan SQL dalam senyawa gagal, pernyataan SQL sebelumnya tidak akan digulung balik. Ini adalah perilaku default ketika
ATOMICtidak ditentukan.declare_variableDeklarasi variabel lokal untuk satu atau beberapa variabel
-
Nama untuk variabel. Nama tidak boleh berkualifikasi dan harus unik dalam pernyataan majemuk.
data_typeJenis data apa pun yang didukung. Jika data_type dihilangkan, Anda harus menentukan DEFAULT, dan jenisnya berasal dari default_expression.
{ DEFAULT | = } default_expressionMenentukan nilai awal variabel setelah deklarasi. default_expression harus dapat dikonversi ke data_type. Jika tidak ada default yang ditentukan, variabel diinisialisasi dengan NULL.
-
Declare_conditionDeklarasi kondisi lokal
-
Nama kondisi yang tidak memenuhi syarat dilingkup ke pernyataan majemuk.
sqlstateSTRINGharfiah 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'.
-
-
Berlaku untuk:
Databricks Runtime 18.1 ke atasDeklarasi 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.
-
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,
declare_handlerDeklarasi untuk penanganan kesalahan.
handler_typeEXITMengklasifikasikan handler untuk keluar dari pernyataan senyawa setelah kondisi ditangani. Semua kursor yang dibuka dalam pernyataan gabungan dan pernyataan senyawa berlapis ditutup secara implisit.
CONTINUEBerlaku untuk:
Databricks Runtime 18.1 ke atasMengklasifikasikan handler untuk melanjutkan eksekusi setelah handler selesai. Eksekusi dilanjutkan dengan pernyataan setelah yang menaikkan kondisi.
condition_valuesMenentukan 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.sqlstateHarfiah
STRING5 karakter'A'-'Z'dan'0'-'9'(tidak peka huruf besar/kecil).-
Kondisi yang ditentukan dalam senyawa ini, pernyataan senyawa luar, atau kelas kesalahan yang ditentukan sistem.
SQLEXCEPTIONBerlaku untuk kondisi kesalahan yang dihadapi pengguna.
NOT FOUNDBerlaku 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_actionPernyataan SQL untuk dijalankan ketika salah satu nilai kondisi terjadi. Untuk menambahkan beberapa pernyataan, gunakan pernyataan gabungan berlapis.
SQL_statementPernyataan SQL seperti DDL, DML, pernyataan kontrol, atau pernyataan majemuk. Pernyataan
SELECTatauVALUESapa 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;
Artikel terkait
- Pembuatan Skrip SQL
- Transaksi
- Mode transaksi
- MULAI TRANSAKSI
- COMMIT
- ROLLBACK
- Pernyataan CASE
- Pernyataan IF
- Pernyataan LOOP
- Pernyataan WHILE
- Pernyataan REPEAT
- Pernyataan FOR
- Pernyataan ITERATE
- Pernyataan LEAVE
- SIGNAl Pernyataan
- Pernyataan RESIGNAL
- GET Pernyataan DIAGNOSTIK
- Pernyataan OPEN
- Pernyataan FETCH
- Pernyataan CLOSE