Setelah menjalankan pernyataan INSERT, UPDATE, atau DELETE, fitur Returning langsung mengembalikan baris yang terpengaruh—tanpa memerlukan pernyataan SELECT tambahan. Fitur ini berguna untuk mengambil nilai yang dihasilkan oleh database, seperti ID AUTO_INCREMENT atau nilai kolom DEFAULT.
Prasyarat
Sebelum memulai, pastikan bahwa:
Kluster PolarDB for MySQL Anda menjalankan versi 5.7 dengan revisi versi 5.7.1.0.6 atau lebih baru. Untuk memeriksa versi Anda, lihat Query the engine version.
Cara kerja
MySQL standar hanya mengembalikan pesan OK atau ERR setelah pernyataan DML. Pesan tersebut mencakup jumlah baris yang terpengaruh dan dipindai, tetapi tidak berisi data baris aktualnya. Untuk memeriksa datanya, biasanya Anda harus menjalankan pernyataan SELECT tambahan—yang berarti memerlukan komunikasi putaran kedua ke server.
Fitur Returning menghilangkan kebutuhan akan komunikasi putaran kedua tersebut. Panggil DBMS_TRANS.RETURNING() bersama dengan pernyataan DML dan daftar kolom. Prosedur ini menjalankan DML dan mengembalikan baris yang sesuai dalam satu respons.
CALL DBMS_TRANS.RETURNING() bukan merupakan pernyataan transaksional. Prosedur ini mewarisi konteks transaksi dari pernyataan DML yang Anda berikan. Lakukan commit atau rollback transaksi secara eksplisit.Sintaksis
CALL DBMS_TRANS.RETURNING(Field_list=>, Statement=>);Parameter
| Parameter | Description |
|---|---|
Field_list | Daftar kolom yang dipisahkan koma untuk dikembalikan, atau * untuk semua kolom. Ekspresi perhitungan dan agregasi tidak didukung. Berikan string kosong ("") untuk menonaktifkan set hasil dan hanya mengembalikan pesan OK atau ERR. |
Statement | Pernyataan DML yang akan dijalankan. Jenis yang didukung: INSERT, UPDATE, DELETE. |
Batasan
INSERT: Hanya pernyataan
INSERT ... VALUESyang didukung. PernyataanINSERT ... SELECTdanCREATE TABLE ... AS SELECTtidak didukung. Menjalankan bentuk yang tidak didukung akan menghasilkanERROR 7527 (HY000): Statement didn't support RETURNING clause.UPDATE: Pernyataan UPDATE multi-tabel tidak didukung.
Contoh
Semua contoh menggunakan tabel berikut:
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;INSERT
Kembalikan semua kolom untuk baris yang dimasukkan, termasuk id AUTO_INCREMENT dan nilai col2 DEFAULT yang dihasilkan oleh database:
CALL DBMS_TRANS.RETURNING("*", "insert into t(id) values(NULL),(NULL)");Hasil:
+----+------+---------------------+
| 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)Untuk menonaktifkan set hasil dan hanya mengembalikan pesan OK atau ERR, berikan string kosong sebagai Field_list:
CALL DBMS_TRANS.RETURNING("", "insert into t(id) values(NULL),(NULL)");Hasil:
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0UPDATE
Kembalikan baris yang diperbarui beserta nilai kolom barunya:
CALL DBMS_TRANS.RETURNING("id, col1, col2", "update t set col1 = 2 where id > 2");Hasil:
+----+------+---------------------+
| 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)DELETE
Kembalikan baris yang dihapus beserta nilainya sebelum penghapusan:
CALL DBMS_TRANS.RETURNING("id, col1, col2", "delete from t where id < 3");Hasil:
+----+------+---------------------+
| 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)