Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Mengembalikan set hasil
Anda dapat mengembalikan set hasil menggunakan kursor atau tabel temp.
Mengembalikan kursor
Untuk mengembalikan kursor, buat prosedur dengan argumen INOUT yang ditentukan dengan tipe refcursor
data. Saat Anda memanggil prosedur, beri nama kursor. Kemudian Anda dapat mengambil hasil dari kursor dengan nama.
Contoh berikut membuat prosedur bernama get_result_set
dengan argumen INOUT bernama rs_out
menggunakan tipe refcursor
data. Prosedur membuka kursor menggunakan pernyataan SELECT.
CREATE OR REPLACE PROCEDURE get_result_set (param IN integer, rs_out INOUT refcursor) AS $$ BEGIN OPEN rs_out FOR SELECT * FROM fact_tbl where id >= param; END; $$ LANGUAGE plpgsql;
Perintah CALL berikut membuka kursor dengan namamycursor
. Gunakan kursor hanya dalam transaksi.
BEGIN; CALL get_result_set(1, 'mycursor');
Setelah kursor dibuka, Anda dapat mengambil dari kursor, seperti yang ditunjukkan contoh berikut.
FETCH ALL FROM mycursor; id | secondary_id | name -------+--------------+--------- 1 | 1 | Joe 1 | 2 | Ed 2 | 1 | Mary 1 | 3 | Mike (4 rows)
Pada akhirnya, transaksi dilakukan atau dibatalkan.
COMMIT;
Kursor yang dikembalikan oleh prosedur tersimpan tunduk pada kendala dan pertimbangan kinerja yang sama seperti yang dijelaskan dalam DECLARE CURSOR. Untuk informasi selengkapnya, lihat Kendala kursor.
Contoh berikut menunjukkan panggilan prosedur yang get_result_set
disimpan menggunakan tipe refcursor
data dari JDBC. Literal 'mycursor'
(nama kursor) diteruskan ke. prepareStatement
Kemudian hasilnya diambil dari. ResultSet
static void refcursor_example(Connection conn) throws SQLException { conn.setAutoCommit(false); PreparedStatement proc = conn.prepareStatement("CALL get_result_set(1, 'mycursor')"); proc.execute(); ResultSet rs = statement.executeQuery("fetch all from mycursor"); while (rs.next()) { int n = rs.getInt(1); System.out.println("n " + n); }
Menggunakan tabel temp
Untuk mengembalikan hasil, Anda dapat mengembalikan pegangan ke tabel temp yang berisi baris hasil. Klien dapat memberikan nama sebagai parameter untuk prosedur yang disimpan. Di dalam prosedur tersimpan, SQL dinamis dapat digunakan untuk beroperasi pada tabel temp. Bagian berikut menunjukkan satu contoh.
CREATE PROCEDURE get_result_set(param IN integer, tmp_name INOUT varchar(256)) as $$ DECLARE row record; BEGIN EXECUTE 'drop table if exists ' || tmp_name; EXECUTE 'create temp table ' || tmp_name || ' as select * from fact_tbl where id <= ' || param; END; $$ LANGUAGE plpgsql; CALL get_result_set(2, 'myresult'); tmp_name ----------- myresult (1 row) SELECT * from myresult; id | secondary_id | name ----+--------------+------ 1 | 1 | Joe 2 | 1 | Mary 1 | 2 | Ed 1 | 3 | Mike (4 rows)