

 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.

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

Membuat prosedur tersimpan baru atau menggantikan 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 CREATE OR REPLACE PROCEDURE:
+ Untuk CREATE PROCEDURE:
  + Superuser
  + Pengguna dengan hak istimewa CREATE dan USE 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 yang sama dan tipe data argumen masukan, atau tanda tangan, seperti yang 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\$1prosedur\$1name*   
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 pengidentifikasi](r_names.md).   
Kami menyarankan Anda mengawali semua nama prosedur yang disimpan dengan`sp_`. Amazon Redshift mencadangkan `sp_` awalan untuk nama prosedur yang disimpan. Dengan menggunakan `sp_` awalan, Anda memastikan bahwa nama prosedur tersimpan 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 masukan mencakup argumen* IN dan INOUT, dan *argumen keluaran mencakup argumen* OUT dan INOUT.  
Argumen OUT tidak ditentukan sebagai bagian dari pernyataan CALL. Tentukan argumen INOUT dalam pernyataan CALL prosedur yang disimpan. Argumen INOUT dapat berguna saat meneruskan dan mengembalikan nilai dari panggilan bersarang, dan juga saat mengembalikan a. `refcursor` Untuk informasi lebih lanjut tentang `refcursor` jenis, lihat[Cursors](c_PLpgSQL-statements.md#r_PLpgSQL-cursors).  
Tipe data argumen dapat berupa tipe data Amazon Redshift standar apa pun. Selain itu, tipe data argumen dapat`refcursor`.  
Anda dapat menentukan maksimum 32 argumen masukan dan 32 argumen keluaran. 

AS \$1\$1 *processre\$1body \$1\$1*   
Sebuah konstruksi yang mencakup prosedur yang akan dijalankan. Kata kunci literal AS \$1\$1 dan \$1\$1 diperlukan.  
Amazon Redshift mengharuskan Anda untuk melampirkan pernyataan dalam prosedur Anda dengan menggunakan format yang disebut kutipan dolar. Apa pun di dalam kandang dilewatkan persis seperti apa adanya. Anda tidak perlu melarikan diri dari karakter khusus apa pun karena isi string ditulis secara harfiah.  
Dengan *kutipan dolar,* Anda menggunakan sepasang tanda dolar (\$1\$1) 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 tersebut. String yang Anda gunakan harus sama di awal dan akhir pasangan enklosur. String ini peka huruf besar/kecil, dan mengikuti batasan yang sama dengan pengenal yang tidak dikutip kecuali bahwa string ini tidak dapat berisi tanda dolar. Contoh berikut menggunakan tes string.  

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

 *prosedur\$1body*   
Satu set PL/pgSQL pernyataan yang valid. PL/pgSQL pernyataan menambah perintah SQL dengan konstruksi prosedural, termasuk perulangan dan ekspresi kondisional, untuk mengontrol aliran logis. Sebagian besar perintah SQL dapat digunakan dalam badan prosedur, termasuk bahasa modifikasi data (DHTML) seperti COPY, UNLOAD dan INSERT, dan bahasa definisi data (DDL) seperti CREATE TABLE. Untuk informasi selengkapnya, lihat [Referensi bahasa PL/PGSQL](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  
Menciptakan prosedur tersimpan dalam modus transaksi nonatomik. Mode NONATOMIC secara otomatis melakukan 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 melakukan 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 (secara eksplisit atau implisit) ditutup secara otomatis ketika komit implisit diproses. Oleh karena itu, Anda harus membuka transaksi eksplisit sebelum memulai kursor loop untuk memastikan bahwa SQL apa pun dalam iterasi loop tidak secara implisit berkomitmen.

SECURITY INVOKER \$1 SECURITY DEFINER  
`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. Defaultnya 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. 

SET configuration\$1parameter \$1TO nilai \$1 = nilai\$1  
Opsi ini tidak didukung saat `NONATOMIC` ditentukan.  
Klausa SET menyebabkan yang ditentukan diatur `configuration_parameter` ke nilai yang ditentukan saat prosedur dimasukkan. Klausul 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 menjalankan fungsi CURRENT\$1USER dari dalam prosedur tersimpan, Amazon Redshift mengembalikan nama pengguna pemilik prosedur yang disimpan.

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

**catatan**  
Jika saat menjalankan contoh ini Anda menemukan 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 sensitif:   
 Jangan membuat kode keras informasi sensitif apa pun dalam logika prosedur yang disimpan. Misalnya, jangan tetapkan kata sandi pengguna dalam pernyataan CREATE USER di badan prosedur yang disimpan. Ini menimbulkan risiko keamanan, karena nilai hard-code dapat dicatat 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;
```