Mengembalikan set hasil dari prosedur yang disimpan - Amazon Redshift

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Mengembalikan set hasil dari prosedur yang disimpan

Topik ini menjelaskan bagaimana prosedur tersimpan mengembalikan data.

Anda dapat mengembalikan set hasil menggunakan kursor atau tabel temp.

Mengembalikan kursor

Untuk mengembalikan kursor, buat prosedur dengan INOUT argumen 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 INOUT argumen bernama rs_out menggunakan tipe refcursor data. Prosedur membuka kursor menggunakan SELECT pernyataan.

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;

CALLPerintah 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 pemanggilan prosedur yang get_result_set disimpan menggunakan tipe refcursor data dariJDBC. 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 yang disimpan, dinamis SQL dapat digunakan untuk beroperasi pada tabel suhu. 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)