All Products
Search
Document Center

ApsaraDB RDS:Returning

Last Updated:Mar 29, 2026

Fitur Returning dari AliSQL memungkinkan Anda menjalankan pernyataan DML dan mengambil baris yang terpengaruh dalam satu kali round trip—tanpa memerlukan pernyataan SELECT tambahan. Fitur ini sangat berguna ketika baris yang terpengaruh sulit diidentifikasi secara andal setelah operasi, misalnya baris yang disisipkan dengan kunci AUTO_INCREMENT atau diperbarui melalui klausa WHERE massal.

Hasil eksekusi pernyataan MySQL dibagi menjadi tiga jenis: set hasil, paket OK, dan paket ERR. Paket OK atau ERR berisi atribut seperti jumlah catatan yang terpengaruh dan jumlah catatan yang dipindai. Fitur Returning memungkinkan server merespons klien hanya sekali dengan menggabungkan hasil eksekusi DML ke dalam satu set hasil.

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

  • Instans RDS yang menjalankan MySQL 8.0

Cara kerja

Panggil dbms_trans.returning() dengan daftar bidang yang ingin dikembalikan dan pernyataan DML yang akan dijalankan. Server akan mengeksekusi pernyataan DML tersebut dan mengembalikan baris yang terpengaruh sebagai set hasil.

Sintaks

DBMS_TRANS.returning(<Field_list>, <Statement>);
ParameterDeskripsi
Field_listBidang-bidang yang akan dikembalikan. Pisahkan multiple bidang dengan koma. Mendukung bidang native dan wildcard (*). Ekspresi agregasi dan kalkulasi tidak didukung. Untuk mengembalikan paket OK alih-alih set hasil, berikan string kosong ("").
StatementPernyataan DML yang akan dijalankan. Hanya mendukung INSERT, UPDATE, dan DELETE.

Catatan penggunaan

dbms_trans.returning() bukan merupakan pernyataan transaksional. Pernyataan ini mewarisi konteks transaksi dari pernyataan DML yang dibungkusnya. Untuk mengakhiri transaksi, lakukan commit atau rollback secara eksplisit.

INSERT Returning

Mengembalikan baris-baris yang disisipkan oleh pernyataan INSERT, termasuk nilai kolom auto-increment dan nilai default yang ditentukan oleh server saat penyisipan.

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

Sisipkan dua baris dan ambil hasilnya dalam satu panggilan:

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)

Batasan

  • Hanya pernyataan bergaya INSERT VALUES yang didukung. Pernyataan INSERT SELECT dan CREATE AS tidak didukung.

    mysql> call dbms_trans.returning("", "insert into t select * from t");
    ERROR 7527 (HY000): Statement didn't support RETURNING clause
  • Jika Field_list dikosongkan, maka akan dikembalikan paket OK 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

UPDATE Returning

Mengembalikan baris-baris yang diperbarui oleh pernyataan UPDATE.

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)

Batasan: Pernyataan UPDATE multi-tabel tidak didukung.

DELETE Returning

Mengembalikan baris-baris yang dihapus oleh pernyataan DELETE.

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)