

 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.

# BUAT PROSEDUR
<a name="r_CREATE_PROCEDURE"></a>

Membuat prosedur tersimpan baru atau mengganti prosedur yang ada untuk database saat ini.

Untuk informasi selengkapnya dan contoh tambahan, lihat [Membuat prosedur tersimpan di Amazon Redshift](stored-procedure-overview.md).

## Hak istimewa yang diperlukan
<a name="r_CREATE_PROCEDURE-privileges"></a>

Anda harus memiliki izin dengan salah satu cara berikut untuk menjalankan PROSEDUR CREATE OR REPLACE:
+ Untuk MEMBUAT PROSEDUR:
  + Superuser
  + Pengguna dengan hak istimewa CREATE dan USAGE pada skema tempat prosedur tersimpan dibuat
+ Untuk PROSEDUR PENGGANTIAN:
  + Superuser
  + Pemilik prosedur

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

```
CREATE [ OR REPLACE ] PROCEDURE sp_procedure_name  
  ( [ [ argname ] [ argmode ] argtype [, ...] ] )
[ NONATOMIC ]
AS $$
  procedure_body
$$ LANGUAGE plpgsql
[ { SECURITY INVOKER | SECURITY DEFINER } ]
[ SET configuration_parameter { TO value | = value } ]
```

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

 ATAU GANTI   
Klausa yang menentukan bahwa jika prosedur dengan nama dan tipe data argumen input yang sama, atau tanda tangan, seperti yang ini sudah ada, prosedur yang ada diganti. Anda hanya dapat mengganti prosedur dengan prosedur baru yang mendefinisikan kumpulan tipe data yang identik.   
Jika Anda menentukan prosedur dengan nama yang sama dengan prosedur yang ada, tetapi tanda tangan yang berbeda, Anda membuat prosedur baru. Dengan kata lain, nama prosedur kelebihan beban. Untuk informasi selengkapnya, lihat [Nama prosedur overloading](stored-procedure-naming.md#stored-procedure-overloading-name). 

 *sp\_nama\_prosedur *   
Nama prosedurnya. Jika Anda menentukan nama skema (seperti**myschema.myprocedure**), prosedur dibuat dalam skema yang ditentukan. Jika tidak, prosedur dibuat dalam skema saat ini. Untuk informasi selengkapnya tentang nama yang valid, lihat[Nama dan pengenal](r_names.md).   
Sebaiknya awali semua nama prosedur tersimpan dengan`sp_`. Amazon Redshift menyimpan `sp_` awalan untuk nama prosedur yang disimpan. Dengan menggunakan `sp_` awalan, Anda memastikan bahwa nama prosedur yang disimpan tidak bertentangan dengan nama prosedur atau fungsi tersimpan bawaan Amazon Redshift yang ada atau yang akan datang. Untuk informasi selengkapnya, lihat [Penamaan prosedur tersimpan](stored-procedure-naming.md).  
Anda dapat menentukan lebih dari satu prosedur dengan nama yang sama jika tipe data untuk argumen input, atau tanda tangan, berbeda. Dengan kata lain, dalam hal ini nama prosedur kelebihan beban. Untuk informasi selengkapnya, lihat [Nama prosedur overloading](stored-procedure-naming.md#stored-procedure-overloading-name)

*[argname] [argmode] argtype *   
Daftar nama argumen, mode argumen, dan tipe data. Hanya tipe data yang diperlukan. Nama dan mode bersifat opsional dan posisinya dapat dialihkan.  
Mode argumen bisa IN, OUT, atau INOUT. Defaultnya adalah IN.  
Anda dapat menggunakan argumen OUT dan INOUT untuk mengembalikan satu atau lebih nilai dari panggilan prosedur. Ketika ada argumen OUT atau INOUT, panggilan prosedur mengembalikan satu baris hasil yang berisi * n * kolom, di mana * n * adalah jumlah total argumen OUT atau INOUT.  
Argumen INOUT adalah argumen input dan output pada saat yang bersamaan. *Argumen input * mencakup argumen IN dan INOUT, dan argum * en output * mencakup argumen OUT dan INOUT.  
Argumen OUT tidak ditentukan sebagai bagian dari pernyataan CALL. Tentukan argumen INOUT dalam pernyataan CALL prosedur tersimpan. Argumen INOUT dapat berguna saat meneruskan dan mengembalikan nilai dari panggilan bersarang, dan juga saat mengembalikan a. `refcursor` Untuk informasi selengkapnya tentang `refcursor` jenis, lihat[Cursors](c_PLpgSQL-statements.md#r_PLpgSQL-cursors).  
Jenis data argumen dapat berupa tipe data Amazon Redshift standar apa pun. Selain itu, tipe data argumen bisa`refcursor`.  
Anda dapat menentukan maksimum 32 argumen input dan 32 argumen output. 

AS $$ prosedur * \_badan $$ *   
Konstruksi yang menyertakan prosedur yang akan dijalankan. Kata kunci literal AS $$ dan $$ diperlukan.  
Amazon Redshift mengharuskan Anda untuk melampirkan pernyataan dalam prosedur Anda dengan menggunakan format yang disebut kuotasi dolar. Apa pun di dalam kandang dilewatkan persis apa adanya. Anda tidak perlu melarikan diri dari karakter khusus karena isi string ditulis secara harfiah.  
Dengan * kutipan dolar, * Anda menggunakan sepasang tanda dolar ($$) untuk menandakan awal dan akhir pernyataan yang akan dijalankan, seperti yang ditunjukkan pada contoh berikut.  

```
$$ my statement $$
```
Secara opsional, di antara tanda-tanda dolar di setiap pasangan, Anda dapat menentukan string untuk membantu mengidentifikasi pernyataan. String yang Anda gunakan harus sama di awal dan akhir pasangan penutup. String ini peka huruf besar-kecil, dan mengikuti batasan yang sama dengan pengidentifikasi yang tidak dikutip kecuali bahwa itu tidak dapat berisi tanda dolar. Contoh berikut menggunakan uji string.  

```
$test$ my statement $test$
```
Sintaks ini juga berguna untuk kutipan dolar bersarang. Untuk informasi lebih lanjut tentang kutipan dolar, lihat "Konstanta Dollar-quoted String” di bawah Struktur Lek [ sikal ](https://www.postgresql.org/docs/9.0/sql-syntax-lexical.html) dalam dokumentasi PostgreSQL.

 *badan\_prosedur *   
Satu set PL/pgSQL pernyataan yang valid. PL/pgSQL pernyataan menambah perintah SQL dengan konstruksi prosedural, termasuk ekspresi perulangan dan kondisional, untuk mengontrol aliran logis. Sebagian besar perintah SQL dapat digunakan dalam badan prosedur, termasuk bahasa modifikasi data (DML) seperti COPY, UNLOAD dan INSERT, dan bahasa definisi data (DDL) seperti CREATE TABLE. Untuk informasi selengkapnya, lihat [PL/pgSQL referensi bahasa](c_pl_pgSQL_reference.md). 

BAHASA * plpgsql *  
Nilai bahasa. Tentukan `plpgsql`. Anda harus memiliki izin untuk penggunaan bahasa untuk digunakan`plpgsql`. Untuk informasi selengkapnya, lihat [HIBAH](r_GRANT.md). 

NONATOMIK  
Membuat prosedur tersimpan dalam mode transaksi nonatomik. Mode NONATOMIC secara otomatis mengkomit pernyataan di dalam prosedur. Selain itu, ketika kesalahan terjadi di dalam prosedur NONATOMIC, kesalahan tidak dilemparkan kembali jika ditangani oleh blok pengecualian. Untuk informasi selengkapnya, lihat [Mengelola transaksi](stored-procedure-transaction-management.md) dan [MENAIKKAN](c_PLpgSQL-statements.md#r_PLpgSQL-messages-errors).  
Saat Anda mendefinisikan prosedur tersimpan sebagai`NONATOMIC`, pertimbangkan hal berikut:  
+ Saat Anda memasukkan panggilan prosedur tersimpan, semua prosedur harus dibuat dalam mode transaksi yang sama.
+ `SECURITY DEFINER`Opsi dan `SET configuration_parameter` opsi tidak didukung saat membuat prosedur dalam mode NONATOMIC.
+ Setiap kursor yang dibuka (eksplisit atau implisit) ditutup secara otomatis ketika komit implisit diproses. Oleh karena itu, Anda harus membuka transaksi eksplisit sebelum memulai loop kursor untuk memastikan bahwa setiap SQL dalam iterasi loop tidak terikat secara implisit.

PEMANGGIL KEAMANAN \| PENENTU KEAMANAN  
`SECURITY DEFINER`Opsi ini tidak didukung ketika `NONATOMIC` ditentukan.  
Mode keamanan untuk prosedur menentukan hak akses prosedur saat runtime. Prosedur harus memiliki izin untuk mengakses objek database yang mendasarinya.   
Untuk mode SECURITY INVOKER, prosedur menggunakan hak istimewa pengguna yang memanggil prosedur. Pengguna harus memiliki izin eksplisit pada objek database yang mendasarinya. Standarnya adalah SECURITY INVOKER.  
Untuk mode SECURITY DEFINER, prosedur menggunakan hak istimewa pemilik prosedur. Pemilik prosedur didefinisikan sebagai pengguna yang memiliki prosedur pada waktu berjalan, belum tentu pengguna yang awalnya mendefinisikan prosedur. Pengguna yang memanggil prosedur memerlukan hak istimewa eksekusi pada prosedur, tetapi tidak memerlukan hak istimewa apa pun pada objek yang mendasarinya. 

SETEL configuration\_parameter {KE nilai \| = nilai}  
Opsi ini tidak didukung ketika `NONATOMIC` ditentukan.  
Klausa SET menyebabkan yang ditentukan diatur `configuration_parameter` ke nilai yang ditentukan saat prosedur dimasukkan. Klausa ini kemudian mengembalikan `configuration_parameter` ke nilai sebelumnya ketika prosedur keluar. 

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

Jika prosedur tersimpan dibuat menggunakan opsi SECURITY DEFINER, saat memanggil fungsi CURRENT\_USER dari dalam prosedur tersimpan, Amazon Redshift mengembalikan nama pengguna pemilik prosedur tersimpan.

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

**catatan**  
Jika saat menjalankan contoh ini Anda mengalami kesalahan yang mirip dengan:  

```
ERROR: 42601: [Amazon](500310) unterminated dollar-quoted string at or near "$$
```
Lihat [Ikhtisar prosedur tersimpan di Amazon Redshift](stored-procedure-create.md). 

Contoh berikut membuat prosedur dengan dua parameter input.

```
CREATE OR REPLACE PROCEDURE test_sp1(f1 int, f2 varchar(20))
AS $$
DECLARE
  min_val int;
BEGIN
  DROP TABLE IF EXISTS tmp_tbl;
  CREATE TEMP TABLE tmp_tbl(id int);
  INSERT INTO tmp_tbl values (f1),(10001),(10002);
  SELECT min_val MIN(id) FROM tmp_tbl;
  RAISE INFO 'min_val = %, f2 = %', min_val, f2;
END;
$$ LANGUAGE plpgsql;
```

**catatan**  
 Saat Anda menulis prosedur tersimpan, kami merekomendasikan praktik terbaik untuk mengamankan nilai-nilai sensitif:   
 Jangan membuat kode keras informasi sensitif apa pun dalam logika prosedur yang disimpan. Misalnya, jangan menetapkan kata sandi pengguna dalam pernyataan CREATE USER di badan prosedur yang disimpan. Ini menimbulkan risiko keamanan, karena nilai hard-code dapat direkam sebagai metadata skema dalam tabel katalog. Sebagai gantinya, berikan nilai sensitif, seperti kata sandi, sebagai argumen ke prosedur yang disimpan, melalui parameter.   
Untuk informasi selengkapnya tentang prosedur tersimpan, lihat [ MEMBUAT PROSEDUR ](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_PROCEDURE.html) dan [ Membuat prosedur tersimpan di Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/stored-procedure-overview.html). Untuk informasi selengkapnya tentang tabel katalog, lihat [ Tabel katalog sistem](https://docs.aws.amazon.com/redshift/latest/dg/c_intro_catalog_views.html).

Contoh berikut membuat prosedur dengan satu parameter IN, satu parameter OUT, dan satu parameter INOUT.

```
CREATE OR REPLACE PROCEDURE test_sp2(f1 IN int, f2 INOUT varchar(256), out_var OUT varchar(256))
AS $$
DECLARE
  loop_var int;
BEGIN
  IF f1 is null OR f2 is null THEN
    RAISE EXCEPTION 'input cannot be null';
  END IF;
  DROP TABLE if exists my_etl;
  CREATE TEMP TABLE my_etl(a int, b varchar);
    FOR loop_var IN 1..f1 LOOP
        insert into my_etl values (loop_var, f2);
        f2 := f2 || '+' || f2;
    END LOOP;
  SELECT INTO out_var count(*) from my_etl;
END;
$$ LANGUAGE plpgsql;
```

Contoh berikut membuat prosedur yang menggunakan `SECURITY DEFINER` parameter. Prosedur ini berjalan menggunakan hak istimewa pengguna yang memiliki prosedur.

```
CREATE OR REPLACE PROCEDURE sp_get_current_user_definer()
AS $$
DECLARE curr_user varchar(250);
BEGIN
  SELECT current_user INTO curr_user;
  RAISE INFO '%', curr_user;
END;
$$ LANGUAGE plpgsql
SECURITY DEFINER;
```

Contoh berikut membuat prosedur yang menggunakan `SECURITY INVOKER` parameter. Prosedur ini berjalan menggunakan hak istimewa pengguna yang menjalankan prosedur.

```
CREATE OR REPLACE PROCEDURE sp_get_current_user_invoker()
AS $$
DECLARE curr_user varchar(250);
BEGIN
  SELECT current_user INTO curr_user;
  RAISE INFO '%', curr_user;
END;
$$ LANGUAGE plpgsql
SECURITY INVOKER;
```