Như bạn có thể biết trong tất cả các phiên bản cho đến PostgreSQL 10, không thể tạo một thủ tục trong PostgreSQL. Trong PostgreSQL 11, PROCEDURE đã được thêm vào dưới dạng một đối tượng lược đồ mới, một đối tượng tương tự như FUNCTION, nhưng không có giá trị trả về.
Qua nhiều năm, nhiều người đã lo lắng muốn có chức năng này và cuối cùng nó đã được thêm vào trong PostgreSQL 11. Theo truyền thống, PostgreSQL đã cung cấp tất cả các phương tiện để viết các hàm (được gọi là các thủ tục được lưu trữ) tuy nhiên, trong một hàm, bạn không thể chạy các giao dịch. Tất cả những gì bạn thực sự có thể sử dụng là các ngoại lệ, về cơ bản là các điểm lưu. Bên trong một cơ quan chức năng, bạn không thể chỉ thực hiện một giao dịch hoặc mở một giao dịch mới. QUY TRÌNH TẠO mới sẽ thay đổi tất cả những điều đó và cung cấp một chức năng để chạy các giao dịch bên trong mã thủ tục.
Lợi ích của việc sử dụng các thủ tục được lưu trữ
- Kiểm soát giao dịch cho phép chúng tôi CAM KẾT và QUAY LẠI các thủ tục bên trong.
- Rất hữu ích cho việc di chuyển Oracle sang PostgreSQL, chức năng thủ tục mới có thể giúp tiết kiệm thời gian đáng kể.
- Như bạn có thể thấy, có một số điểm tương đồng giữa TẠO CHỨC NĂNG và TẠO QUY TRÌNH, vì vậy mọi thứ sẽ thực sự dễ dàng đối với hầu hết người dùng cuối.
Cách sử dụng thủ tục được lưu trữ trong PostgreSQL
Sử dụng CREATE PROCEDURE để tạo một thủ tục mới trong PostgreSQL 11, nó sẽ cho phép bạn viết thủ tục giống như các cơ sở dữ liệu khác. PROCEDURE gần giống như FUNCTION không có giá trị trả về. PROCEDURE được tạo bằng câu lệnh CREATE PROCEDURE trong PostgreSQL 11. Không giống như câu lệnh CREATE FUNCTION, không có mệnh đề RETURNS, mệnh đề ROWS, v.v.
Cú pháp
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'
} ...
Ví dụ
CREATE PROCEDURE procedure1(INOUT p1 TEXT)
AS $$
BEGIN
RAISE NOTICE 'Procedure Parameter: %', p1 ;
END ;
$$
LANGUAGE plpgsql ;
Thực thi QUY TRÌNH trong PostgreSQL
Để thực thi PROCEDURE trong PostgreSQL, hãy sử dụng câu lệnh CALL thay vì câu lệnh SELECT. Đây là một trong những điểm khác biệt giữa THỦ TỤC và CHỨC NĂNG.
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)
Bạn cũng có thể chỉ định tên tham số trong câu lệnh CALL. Đây là một cách khác để thực hiện THỦ TỤC.
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)
Hiển thị Danh sách THỦ TỤC Đã Tạo
Bạn có thể kiểm tra định nghĩa của PROCEDURE đã tạo từ lệnh psql, tức là '\ df'. Lệnh psql '\ df' cũng được sử dụng để hiển thị định nghĩa của FUNCTION đã tạo.
QUY TRÌNH hiển thị cột Loại là "proc" và nếu nó là FUNCTION thì cột Loại sẽ thay đổi thành "func".
Trong danh sách các chức năng bên dưới, chúng tôi đã tạo một QUY TRÌNH để cột Loại thay đổi thành "quy trình".
postgres=# \df
List of functions
Schema | Name | Result data type | Argument data types | Type
--------+------------+------------------+---------------------+------
public | procedure1 | | INOUT p1 text | proc
(1 row)
Tại đây, chúng ta có thể tạo một FUNCTION để kiểm tra cột Type.
CREATE FUNCTION function1(INOUT p1 TEXT)
AS $$
BEGIN
RAISE NOTICE 'Function Parameter: %', p1 ;
END ;
$$
LANGUAGE plpgsql ;
Thực thi FUNCTION bằng lệnh 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)
Bây giờ bạn có thể kiểm tra cột Loại và thấy sự khác biệt. Đối với hàm FUNCTION1, cột Loại đã thay đổi thành "func". Bạn có thể thấy một điểm khác biệt nữa ở đây, PROCEDURE gần giống như FUNCTION không có giá trị trả về.
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)
Định nghĩa QUY TRÌNH Hiển thị trong PostgreSQL
Sử dụng ‘\ sf’ để hiển thị định nghĩa của THỦ TỤC đã tạo.
postgres=# \sf procedure1
CREATE OR REPLACE PROCEDURE public.procedure1(INOUT p1 text)
LANGUAGE plpgsql
AS $procedure$
BEGIN
RAISE NOTICE 'Procedure Parameter: %', p1 ;
END ;
$procedure$
Tải xuống Báo cáo chính thức hôm nay Quản lý &Tự động hóa PostgreSQL với ClusterControlTìm hiểu về những điều bạn cần biết để triển khai, giám sát, quản lý và mở rộng PostgreSQLTải xuống Báo cáo chính thức Kiểm soát giao dịch trong THỦ TỤC
Kiểm soát giao dịch cho phép chúng tôi CAM KẾT và QUAY LẠI các thủ tục bên trong. CHỨC NĂNG TẠO không hỗ trợ giao dịch bên trong hàm. Đây là sự khác biệt chính giữa FUNCTION và PROCEDURE trong PostgreSQL.
Hãy tạo một thủ tục được lưu trữ đơn giản để xử lý các giao dịch.
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 $$;
Thực thi QUY TRÌNH bằng cách sử dụng câu lệnh CALL.
postgres=# CALL transaction_test();
CALL
Kiểm tra kết quả thực thi.
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)
Trong blog này, chúng tôi đã thấy kiểm soát giao dịch để TẠO THỦ TỤC bằng ngôn ngữ PL / pgSQL nhưng kiểm soát giao dịch cũng được cung cấp bằng các ngôn ngữ khác như PL / Python, PL / Tcl, PL / Perl.
Cú pháp để kiểm soát giao dịch bằng các ngôn ngữ khác như sau:
- PL / Python
- plpy.commit ()
- plpy.rollback ()
- PL / Tcl
- Cam kết
- khôi phục
- PL / Perl
- spi_commit ()
- spi_rollback ()
Kết luận
TẠO THỦ TỤC chắc chắn là một trong những tính năng quan trọng và đáng mong đợi trong PostgreSQL 11. Tính năng này rất hữu ích cho quá trình di chuyển Oracle sang PostgreSQL và nhiều trường hợp sử dụng khác nhau và nhiều người chắc chắn hoan nghênh nó.