傳回結果集 - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

傳回結果集

您可以使用游標或暫存資料表來傳回結果集。

傳回游標

若要傳回游標,請使用以 refcursor 資料類型定義的 INOUT 引數建立程序。當您呼叫程序時,請命名游標,就可以依名稱從游標擷取結果。

下列範例建立名為 get_result_set 的程序,具有名為 rs_out 且使用 refcursor 資料類型的 INOUT 引數。此程序使用 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;

下列 CALL 命令開啟名為 mycursor 的游標。請只在交易內使用游標。

BEGIN; CALL get_result_set(1, 'mycursor');

開啟游標後,您就可以從游標擷取,如下列範例所示。

FETCH ALL FROM mycursor; id | secondary_id | name -------+--------------+--------- 1 | 1 | Joe 1 | 2 | Ed 2 | 1 | Mary 1 | 3 | Mike (4 rows)

最後,交易會遞交或轉返。

COMMIT;

預存程序傳回的游標受制於 DECLARE CURSOR 中所述的相同限制和效能考量。如需詳細資訊,請參閱 游標限制條件

下列範例顯示從 JDBC 使用 refcursor 資料類型呼叫 get_result_set 預存程序。常值 'mycursor' (游標名稱) 會傳給 prepareStatement。然後,從 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); }

使用暫存資料表

若要傳回結果,您可以傳回含有結果列之暫存資料表的控制代碼。用戶端可以將名稱當作參數提供給預存程序。在預存程序內,可使用動態 SQL 來操作暫存資料表。如下列範例所示。

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)