

 Amazon Redshift は、パッチ 198 以降、新しい Python UDF の作成をサポートしなくなります。既存の Python UDF は、2026 年 6 月 30 日まで引き続き機能します。詳細については、[ブログ記事](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)を参照してください。

# ストアドプロシージャから結果セットを返す
<a name="stored-procedure-result-set"></a>

このトピックでは、ストアドプロシージャがデータを返す方法について説明します。

カーソルや一時テーブルを使用して結果セットを返すことができます。

## カーソルを返す
<a name="stored-procedure-return-cursor"></a>

カーソルを返すには、`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 で説明している同じ制約とパフォーマンスの考慮事項が適用されます。。詳細については、「[カーソルの制約](declare.md#declare-constraints)」を参照してください。

次の例では、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);
    }
```

## 一時テーブルの使用
<a name="stored-procedure-return-cursor"></a>

結果を返すには、結果行を含む一時テーブルへのハンドルを返すことができます。クライアントは、パラメータとして名前をストアドプロシージャに渡します。ストアドプロシージャ内では、動的 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)
```