View a markdown version of this page

BUAT PROSEDUR - Amazon Redshift

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 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

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.

Hak istimewa yang diperlukan

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

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

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.

sp_nama_prosedur

Nama prosedurnya. Jika Anda menentukan nama skema (sepertimyschema.myprocedure), prosedur dibuat dalam skema yang ditentukan. Jika tidak, prosedur dibuat dalam skema saat ini. Untuk informasi selengkapnya tentang nama yang valid, lihatNama dan pengenal.

Sebaiknya awali semua nama prosedur tersimpan dengansp_. 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.

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

[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, lihatCursors.

Jenis data argumen dapat berupa tipe data Amazon Redshift standar apa pun. Selain itu, tipe data argumen bisarefcursor.

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 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.

BAHASA plpgsql

Nilai bahasa. Tentukan plpgsql. Anda harus memiliki izin untuk penggunaan bahasa untuk digunakanplpgsql. Untuk informasi selengkapnya, lihat HIBAH.

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 dan MENAIKKAN.

Saat Anda mendefinisikan prosedur tersimpan sebagaiNONATOMIC, pertimbangkan hal berikut:

  • Saat Anda memasukkan panggilan prosedur tersimpan, semua prosedur harus dibuat dalam mode transaksi yang sama.

  • SECURITY DEFINEROpsi 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 DEFINEROpsi 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

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

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.

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 dan Membuat prosedur tersimpan di Amazon Redshift. Untuk informasi selengkapnya tentang tabel katalog, lihat Tabel katalog sistem.

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;