結果セットを返す - 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 から get_result_set データ型を使用して refcursor ストアドプロシージャを呼び出しています。リテラル '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)