PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Gambaran Umum Prosedur Tersimpan Baru di PostgreSQL 11

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ekstrak Bulan dari Tanggal di PostgreSQL

  2. Ulangi dimensi array di plpgsql

  3. Bagaimana saya bisa menggunakan UUID di SQLAlchemy?

  4. Hitung total kumulatif di Postgresql

  5. docker postgres dengan data awal tidak bertahan selama komit