Topik ini menjelaskan fitur Returning dari AliSQL, yang memungkinkan pernyataan bahasa manipulasi data (DML) mengembalikan set hasil dan menyediakan paket DBMS_TRANS untuk melacak eksekusi pernyataan DML.
Informasi latar belakang
Hasil eksekusi pernyataan MySQL terbagi menjadi tiga jenis: set hasil, paket OK, dan paket ERR. Paket OK atau ERR berisi atribut seperti jumlah record yang terpengaruh dan jumlah record yang dipindai. Namun, eksekusi pernyataan DML (INSERT, UPDATE, atau DELETE) sering kali diikuti oleh pernyataan SELECT untuk mengkueri record saat ini. Dalam kasus tersebut, fitur Returning memungkinkan server merespons klien hanya sekali dengan menggabungkan hasil eksekusi kedua pernyataan tersebut ke dalam satu set hasil.
Prasyarat
Instans harus menjalankan RDS MySQL 8.0 atau 8.4.
Sintaksis
DBMS_TRANS.returning(<Field_list>,<Statement>);Tabel berikut menjelaskan parameter yang perlu Anda konfigurasikan.
Parameter | Deskripsi |
Field_list | Bidang yang akan dikembalikan. Untuk menentukan multiple bidang, pisahkan dengan koma (,). Anda dapat menentukan bidang dari tabel atau menggunakan wildcard (*). Operasi seperti perhitungan atau agregasi tidak didukung. |
Statement | Pernyataan DML yang akan dieksekusi. INSERT, UPDATE, dan DELETE didukung. |
Perhatian
Pernyataan dbms_trans.returning() tidak bersifat transaksional. Pernyataan ini mewarisi konteks transaksi dari pernyataan DML. Untuk mengakhiri transaksi, Anda harus secara eksplisit melakukan commit atau rollback transaksi.
INSERT Returning
Server mengembalikan record yang dimasukkan ke dalam tabel yang ditentukan menggunakan pernyataan INSERT.
Contoh:
CREATE TABLE `t` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`col1` int(11) NOT NULL DEFAULT '1',
`col2` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
mysql> call dbms_trans.returning("*", "insert into t(id) values(NULL),(NULL)");
+----+------+---------------------+
| id | col1 | col2 |
+----+------+---------------------+
| 1 | 1 | 2019-09-03 10:39:05 |
| 2 | 1 | 2019-09-03 10:39:05 |
+----+------+---------------------+
2 rows in set (0.01 sec)Jika Anda tidak menentukan parameter Field_list, fitur returning akan mengembalikan paket OK atau ERR alih-alih set hasil.
mysql> call dbms_trans.returning("", "insert into t(id) values(NULL),(NULL)"); Query OK, 2 rows affected (0.01 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from t; +----+------+---------------------+ | id | col1 | col2 | +----+------+---------------------+ | 1 | 1 | 2019-09-03 10:40:55 | | 2 | 1 | 2019-09-03 10:40:55 | | 3 | 1 | 2019-09-03 10:41:06 | | 4 | 1 | 2019-09-03 10:41:06 | +----+------+---------------------+ 4 rows in set (0.00 sec)INSERT Returning hanya mendukung sintaksis
insert values. Sintaksis lain seperticreate asdaninsert selecttidak didukung.mysql> call dbms_trans.returning("", "insert into t select * from t"); ERROR 7527 (HY000): Statement didn't support RETURNING clause
UPDATE Returning
Server mengembalikan record yang diperbarui di tabel yang ditentukan menggunakan pernyataan UPDATE.
Contoh:
mysql> call dbms_trans.returning("id, col1, col2", "update t set col1 = 2 where id >2");
+----+------+---------------------+
| id | col1 | col2 |
+----+------+---------------------+
| 3 | 2 | 2019-09-03 10:41:06 |
| 4 | 2 | 2019-09-03 10:41:06 |
+----+------+---------------------+
2 rows in set (0.01 sec)UPDATE Returning tidak mendukung pernyataan UPDATE multi-tabel.
DELETE Returning
Server mengembalikan record yang dihapus dari tabel yang ditentukan menggunakan pernyataan DELETE.
Contoh:
mysql> call dbms_trans.returning("id, col1, col2", "delete from t where id < 3");
+----+------+---------------------+
| id | col1 | col2 |
+----+------+---------------------+
| 1 | 1 | 2019-09-03 10:40:55 |
| 2 | 1 | 2019-09-03 10:40:55 |
+----+------+---------------------+
2 rows in set (0.00 sec)