Seperti yang Anda ketahui di semua versi hingga PostgreSQL 10, tidak mungkin membuat prosedur di PostgreSQL. Di PostgreSQL 11, PROCEDURE ditambahkan sebagai objek skema baru yang merupakan objek yang mirip dengan FUNCTION, tetapi tanpa nilai balik.
Selama bertahun-tahun banyak orang yang ingin memiliki fungsionalitas tersebut dan akhirnya ditambahkan ke dalam PostgreSQL 11. Secara tradisional, PostgreSQL telah menyediakan semua sarana untuk menulis fungsi (yang disebut sebagai prosedur tersimpan) namun, dalam suatu fungsi Anda tidak dapat menjalankan transaksi. Yang benar-benar dapat Anda gunakan hanyalah pengecualian, yang pada dasarnya adalah savepoints. Di dalam badan fungsi Anda tidak bisa begitu saja melakukan transaksi atau membuka yang baru. CREATE PROCEDURE yang baru akan mengubah semua itu dan menyediakan fungsionalitas untuk menjalankan transaksi di dalam kode prosedural.
Manfaat Menggunakan Prosedur Tersimpan
- Kontrol transaksi memungkinkan kami untuk COMMIT dan ROLLBACK di dalam prosedur.
- Sangat membantu migrasi Oracle ke PostgreSQL, fungsionalitas prosedur baru dapat menghemat waktu secara signifikan.
- Seperti yang Anda lihat, ada beberapa kesamaan antara CREATE FUNCTION dan CREATE PROCEDURE sehingga semuanya akan sangat mudah bagi sebagian besar pengguna akhir.
Cara Menggunakan Prosedur Tersimpan di PostgreSQL
Gunakan CREATE PROCEDURE untuk membuat prosedur baru di PostgreSQL 11, ini akan memungkinkan Anda untuk menulis prosedur seperti database lainnya. PROSEDUR hampir sama dengan FUNGSI tanpa nilai balik. PROCEDURE dibuat dengan pernyataan CREATE PROCEDURE di PostgreSQL 11. Berbeda dengan pernyataan CREATE FUNCTION, tidak ada klausa RETURNS, klausa ROWS dll.
Sintaks
postgres=# \h CREATE PROCEDURE
Command: CREATE PROCEDURE
Description: define a new procedure
Syntax:
CREATE [ OR REPLACE ] PROCEDURE
name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] )
{ LANGUAGE lang_name
| TRANSFORM { FOR TYPE type_name } [, ... ]
| [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
| SET configuration_parameter { TO value | = value | FROM CURRENT }
| AS 'definition'
| AS 'obj_file', 'link_symbol'
} ...
Contoh
CREATE PROCEDURE procedure1(INOUT p1 TEXT)
AS $$
BEGIN
RAISE NOTICE 'Procedure Parameter: %', p1 ;
END ;
$$
LANGUAGE plpgsql ;
Jalankan PROCEDURE di PostgreSQL
Untuk menjalankan PROCEDURE di PostgreSQL, gunakan pernyataan CALL alih-alih pernyataan SELECT. Ini adalah salah satu perbedaan antara PROSEDUR dan FUNGSI.
postgres=# CALL procedure1 (' CREATE PROCEDURE functionality supported in PostgreSQL 11! ');
NOTICE: Procedure Parameter: CREATE PROCEDURE functionality supported in PostgreSQL 11!
p1
--------------------------------------------------------------
CREATE PROCEDURE functionality supported in PostgreSQL 11!
(1 row)
Anda juga dapat menentukan nama parameter dalam pernyataan CALL. Ini adalah cara lain untuk menjalankan PROSEDUR.
postgres=# CALL procedure1 (p1=>'CREATE PROCEDURE functionality supported in PostgreSQL 11!');
NOTICE: Procedure Parameter: CREATE PROCEDURE functionality supported in PostgreSQL 11!
p1
------------------------------------------------------------
CREATE PROCEDURE functionality supported in PostgreSQL 11!
(1 row)
Tampilkan Daftar PROSEDUR yang Dibuat
Anda dapat memeriksa definisi PROSEDUR yang dibuat dari perintah psql yaitu '\df'. Perintah psql '\df' juga digunakan untuk menampilkan definisi FUNCTION yang dibuat.
PROSEDUR menunjukkan kolom Type sebagai "proc" dan jika FUNCTION maka kolom Type diubah menjadi "func".
Dalam daftar fungsi di bawah ini, kami telah membuat satu PROSEDUR sehingga kolom Jenis diubah menjadi "proc".
postgres=# \df
List of functions
Schema | Name | Result data type | Argument data types | Type
--------+------------+------------------+---------------------+------
public | procedure1 | | INOUT p1 text | proc
(1 row)
Di sini, kita dapat membuat satu FUNGSI untuk memeriksa kolom Jenis.
CREATE FUNCTION function1(INOUT p1 TEXT)
AS $$
BEGIN
RAISE NOTICE 'Function Parameter: %', p1 ;
END ;
$$
LANGUAGE plpgsql ;
Jalankan FUNCTION menggunakan perintah SELECT.
postgres=# SELECT function1('CREATE PROCEDURE functionality supported in PostgreSQL 11!');
NOTICE: Function Parameter: CREATE PROCEDURE functionality supported in PostgreSQL 11!
function1
------------------------------------------------------------
CREATE PROCEDURE functionality supported in PostgreSQL 11!
(1 row)
Sekarang Anda dapat memeriksa kolom Type dan melihat perbedaannya. Untuk fungsi FUNCTION1, kolom Type diubah menjadi "func". Anda dapat melihat satu lagi perbedaan di sini, PROSEDUR hampir sama dengan FUNGSI tanpa nilai balik.
postgres=# \df
List of functions
Schema | Name | Result data type | Argument data types | Type
--------+------------+------------------+---------------------+------
public | function1 | text | INOUT p1 text | func
public | procedure1 | | INOUT p1 text | proc
(2 rows)
Menampilkan Definisi PROSEDUR di PostgreSQL
Gunakan '\sf' untuk menampilkan definisi PROSEDUR yang dibuat.
postgres=# \sf procedure1
CREATE OR REPLACE PROCEDURE public.procedure1(INOUT p1 text)
LANGUAGE plpgsql
AS $procedure$
BEGIN
RAISE NOTICE 'Procedure Parameter: %', p1 ;
END ;
$procedure$
Unduh Whitepaper Hari Ini Pengelolaan &Otomatisasi PostgreSQL dengan ClusterControlPelajari tentang apa yang perlu Anda ketahui untuk menerapkan, memantau, mengelola, dan menskalakan PostgreSQLUnduh Whitepaper Kontrol Transaksi di PROSEDUR
Kontrol transaksi memungkinkan kami untuk COMMIT dan ROLLBACK di dalam prosedur. CREATE FUNCTION tidak mendukung transaksi di dalam fungsi. Inilah perbedaan utama antara FUNCTION dan PROCEDURE di PostgreSQL.
Mari buat prosedur tersimpan sederhana yang menangani transaksi.
CREATE OR REPLACE PROCEDURE transaction_test()
LANGUAGE plpgsql
AS $$
DECLARE
BEGIN
CREATE TABLE committed_table (id int);
INSERT INTO committed_table VALUES (1);
COMMIT;
CREATE TABLE rollback_table (id int);
INSERT INTO rollback_table VALUES (1);
ROLLBACK;
END $$;
Jalankan PROSEDUR menggunakan pernyataan CALL.
postgres=# CALL transaction_test();
CALL
Periksa hasil eksekusi.
postgres=# \d
List of relations
Schema | Name | Type | Owner
--------+-----------------+-------+----------
public | committed_table | table | postgres
(1 row)
postgres=# SELECT * FROM committed_table;
id
----
1
(1 row)
Di blog ini kita telah melihat kontrol transaksi untuk CREATE PROCEDURE menggunakan bahasa PL/pgSQL tetapi kontrol transaksi juga disediakan dalam bahasa lain seperti PL/Python, PL/Tcl, PL/Perl.
Sintaks untuk kontrol transaksi dalam bahasa lain adalah sebagai berikut:
- PL/Python
- plpy.commit()
- plpy.rollback()
- PL/Tcl
- Berkomitmen
- kembalikan
- PL/Perl
- spi_commit()
- spi_rollback()
Kesimpulan
CREATE PROCEDURE jelas merupakan salah satu fitur penting dan diinginkan di PostgreSQL 11. Fitur ini sangat berguna untuk migrasi Oracle ke PostgreSQL dan banyak kasus penggunaan yang berbeda dan banyak orang pasti menyambutnya.