1. Tình huống
Cần lưu trữ 1 giá trị A khi thực hiện query. Sau đó ở 1 query khác lấy ra giá trị A đó để sử dụng.
2. Cách giải quyết với Oracle DB
Đối với Oracle có thể sử dụng Package để xử lý tình huống trên.
Package là một tập hợp các kiểu dữ liệu, biến lưu giữ giá trị và các thủ tục,hàm có cùng một mối liên hệ với nhau, được gộp chung lại. Đặc điểm nổi bật nhất của package là khi một phần tử trong package được gọi thì toàn bộ nội dung của package sẽ được nạp vào trong hệ thống. Do đó, việc gọi tới các phần tử khác trong package sau này sẽ không phải mất thời gian nạp vào hệ thống nữa. Từ đó, nâng cao tốc độ thực hiện lệnh của toàn bộ hàm, thủ tục có trong package.
Ví dụ package Oracle
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
CREATE PACKAGE vidu AS A INT; FUNCTION setA (value Text) RETURN TEXT; FUNCTION getA() RETURN TEXT; END vidu; / CREATE PACKAGE BODY viduAS FUNCTION setA(value TEXT) RETURN TEXT IS BEGIN A := value; END FUNCTION getA() RETURN TEXT IS BEGIN RETURN A END / |
Như ví dụ trên khi ta gọi function setA ở 1 query nào đó thì những giá trị của package vidu (biến A) cũng được khởi tạo luôn. Sau đó nếu ta gọi getA ở 1 query khác thì sẽ lấy được giá trị của biến A khi chạy setA lúc trước đó
3. Cách giải quyết với Postgres SQL
Vì Postgres không có package như Oracle nên ta phải sử dụng cách khác.
Cách thứ nhất là tạo bảng tạm để lưu trữ dữ liệu nhưng cách này gây tốn perfomance.
Cách thứ 2 là sử dụng hàm set_config và current_settings lưu trữ cặp giá trị key values. Đây là function có sẵn của postgresql
Ví dụ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
CREATE OR REPLACE FUNCTION getA(get_name TEXT) RETURNS TEXT AS $$ DECLARE result_value TEXT; BEGIN execute 'select current_setting($1)' using get_name into result_value; return case result_value when '' then null else result_value end; exception when undefined_object then return null; END; $$ LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION setA(set_name TEXT, set_value TEXT) RETURNS VOID AS $$ BEGIN execute 'select set_config($1, $2, false)' using set_name, set_value; END; |
Sau khi tạo 2 function trên ta sử dụng giống như với oracle. Ví dụ trong query 1 gọi setA sau đó trong query 2 gọi getA thì sẽ lấy được giá trị tương ứng khi gọi setA.
※ Lưu ý vì đây là biến tạm nên 1 khi đã ngắt kết nối với DB tất cả sẽ giá trị sẽ bị xóa.