

 Amazon Redshift tidak akan lagi mendukung penggunaan Python UDF setelah 30 Juni 2026. Kami akan mulai menegakkannya secara bertahap. Untuk informasi lebih lanjut tentang detail opsi akhir masa pakai dan migrasi Python, 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/) yang diterbitkan pada 30 Juni 2025. 

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# PANGGILAN
<a name="r_CALL_procedure"></a>

Menjalankan prosedur tersimpan. Perintah CALL harus menyertakan nama prosedur dan nilai argumen input. Anda harus memanggil prosedur tersimpan dengan menggunakan pernyataan CALL.

**catatan**  
CALL tidak dapat menjadi bagian dari kueri reguler.

## Sintaksis
<a name="r_CALL_procedure-synopsis"></a>

```
CALL sp_name ( [ argument ] [, ...] )
```

## Parameter
<a name="r_CALL_procedure-parameters"></a>

 *sp\_nama *   
Nama prosedur yang akan dijalankan. 

 *argumen *   
Nilai argumen input. Parameter ini juga bisa menjadi nama fungsi, misalnya`pg_last_query_id()`. Anda tidak dapat menggunakan query sebagai argumen CALL. 

## Catatan penggunaan
<a name="r_CALL_procedure-usage-notes"></a>

Prosedur tersimpan Amazon Redshift mendukung panggilan bersarang dan rekursif, seperti yang dijelaskan di bawah ini. Selain itu, pastikan dukungan pengemudi Anda mutakhir, juga dijelaskan berikut.

**Topics**
+ [Panggilan bersarang](#r_CALL_procedure-nested-calls)
+ [Dukungan pengemudi](#r_CALL_procedure-driver-support)

### Panggilan bersarang
<a name="r_CALL_procedure-nested-calls"></a>

Prosedur tersimpan Amazon Redshift mendukung panggilan bersarang dan rekursif. Jumlah maksimum tingkat bersarang yang diizinkan adalah 16. Panggilan bersarang dapat merangkum logika bisnis ke dalam prosedur yang lebih kecil, yang dapat dibagikan oleh beberapa pemanggil. 

Jika Anda memanggil prosedur bersarang yang memiliki parameter keluaran, prosedur dalam harus menentukan argumen INOUT. Dalam hal ini, prosedur bagian dalam dilewatkan dalam variabel nonkonstan. Argumen OUT tidak diperbolehkan. Perilaku ini terjadi karena variabel diperlukan untuk menahan output dari panggilan dalam.

Hubungan antara prosedur dalam dan luar dicatat di `from_sp_call` kolom[SVL\_STORED\_PROC\_CALL](r_SVL_STORED_PROC_CALL.md). 

Contoh berikut menunjukkan meneruskan variabel ke panggilan prosedur bersarang melalui argumen INOUT.

```
CREATE OR REPLACE PROCEDURE inner_proc(INOUT a int, b int, INOUT c int) LANGUAGE plpgsql
AS $$
BEGIN
  a := b * a;
  c := b * c;
END;
$$;

CREATE OR REPLACE PROCEDURE outer_proc(multiplier int) LANGUAGE plpgsql
AS $$
DECLARE
  x int := 3;
  y int := 4;
BEGIN
  DROP TABLE IF EXISTS test_tbl;
  CREATE TEMP TABLE test_tbl(a int, b varchar(256));
  CALL inner_proc(x, multiplier, y);
  insert into test_tbl values (x, y::varchar);
END;
$$;

CALL outer_proc(5);

SELECT * from test_tbl;
 a  | b
----+----
 15 | 20
(1 row)
```

### Dukungan pengemudi
<a name="r_CALL_procedure-driver-support"></a>

Sebaiknya upgrade driver Java Database Connectivity (JDBC) dan Open Database Connectivity (ODBC) ke versi terbaru yang memiliki dukungan untuk prosedur tersimpan Amazon Redshift. 

Anda mungkin dapat menggunakan driver yang ada jika alat klien Anda menggunakan operasi API driver yang melewati pernyataan CALL ke server. Parameter output, jika ada, dikembalikan sebagai hasil set satu baris. 

Versi terbaru dari driver Amazon Redshift JDBC dan ODBC memiliki dukungan metadata untuk penemuan prosedur tersimpan. Mereka juga memiliki `CallableStatement` dukungan untuk aplikasi Java kustom. Untuk informasi selengkapnya tentang driver, lihat [ Menghubungkan ke Cluster Amazon Redshift Menggunakan Alat Klien SQL ](https://docs.aws.amazon.com/redshift/latest/mgmt/connecting-to-cluster.html) di Panduan Manajemen * Amazon Redshift. * 

Contoh berikut menunjukkan cara menggunakan operasi API yang berbeda dari driver JDBC untuk panggilan prosedur tersimpan.

```
void statement_example(Connection conn) throws SQLException {
  statement.execute("CALL sp_statement_example(1)");
}

void prepared_statement_example(Connection conn) throws SQLException {
  String sql = "CALL sp_prepared_statement_example(42, 84)";
  PreparedStatement pstmt = conn.prepareStatement(sql);
  pstmt.execute();
}

void callable_statement_example(Connection conn) throws SQLException {
  CallableStatement cstmt = conn.prepareCall("CALL sp_create_out_in(?,?)");
  cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
  cstmt.setInt(2, 42);
  cstmt.executeQuery();
  Integer out_value = cstmt.getInt(1);
}
```

## Contoh
<a name="r_CALL_procedure-examples"></a>

Contoh berikut memanggil nama prosedur`test_spl`.

```
call test_sp1(3,'book');
INFO:  Table "tmp_tbl" does not exist and will be skipped
INFO:  min_val = 3, f2 = book
```

Contoh berikut memanggil nama prosedur`test_spl2`.

```
call test_sp2(2,'2019');

         f2          | column2
---------------------+---------
 2019+2019+2019+2019 | 2
(1 row)
```