

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 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 使用 `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);
    }
```

## 使用暫存資料表
<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)
```