

 Amazon Redshift tidak akan lagi mendukung pembuatan Python UDFs baru mulai Patch 198. Python yang ada UDFs akan terus berfungsi hingga 30 Juni 2026. Untuk informasi lebih lanjut, lihat [posting blog](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/). 

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
<a name="stored-procedure-result-set"></a>

Topik ini menjelaskan bagaimana prosedur tersimpan mengembalikan data.

Anda dapat mengembalikan set hasil menggunakan kursor atau tabel temp.

## Mengembalikan kursor
<a name="stored-procedure-return-cursor"></a>

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

Perintah CALL berikut membuka kursor dengan nama`mycursor`. 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](declare.md#declare-constraints).

Contoh berikut menunjukkan panggilan prosedur yang `get_result_set` disimpan menggunakan tipe `refcursor` data dari JDBC. 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
<a name="stored-procedure-return-cursor"></a>

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 tersimpan, SQL dinamis dapat digunakan untuk beroperasi pada tabel temp. 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)
```