2009-01-05 18 views
9

Trong PL/SQL của Oracle, tôi có thể tạo một biến toàn cầu dựa trên phiên với định nghĩa gói. Với PLPG/SQL của Postgresql, nó dường như không thể vì không có gói nào, chỉ có các thủ tục và hàm độc lập.Biến toàn cầu dựa trên phiên trong thủ tục lưu trữ Postgresql?

Đây là cú pháp cho PL/SQL để khai báo g_spool_key như một toàn cầu ...

CREATE OR REPLACE PACKAGE tox IS 
     g_spool_key spool.key%TYPE := NULL; 
     TYPE t_spool IS REF CURSOR RETURN spool%ROWTYPE; 
     PROCEDURE begin_spool; 
     PROCEDURE into_spool 
      (
      in_txt IN spool.txt%TYPE 
      ); 
     PROCEDURE reset_spool; 
     FUNCTION end_spool 
      RETURN t_spool; 
     FUNCTION timestamp 
      RETURN VARCHAR2; 
    END tox; 

Làm thế nào tôi sẽ thực hiện một phiên biến toàn cầu có trụ sở với PLpg/SQL?

Trả lời

1

Từ Postgresql forums ...

Vì vậy, một vài câu hỏi ....

  1. Bạn có thể khai báo các giá trị toàn cầu từ plpgsql?
  2. Nếu có, có cách nào để tránh ô nhiễm không gian tên không? (có lẽ tương đương với Oracle sử dụng gói PLSQL biến)

plpgsql không có các biến toàn cầu.

6

Bạn có thể xác định một số tùy chỉnh-biến-lớp trong postgresql.conf của bạn và sử dụng nó như là các biến kết nối trong thủ tục lưu sẵn của bạn. Xem số docs.

Cách sử dụng ví dụ cho một custom-biến-class "IMOS":

imos=> set imos.testvar to 'foobar'; 
SET 
Time: 0.379 ms 
imos=> show imos.testvar; 
imos.testvar 
-------------- 
foobar 
(1 row) 

Time: 0.333 ms 
imos=> set imos.testvar to 'bazbar'; 
SET 
Time: 0.144 ms 
imos=> show imos.testvar; 
imos.testvar 
-------------- 
bazbar 
(1 row) 

Trong lưu trữ-thủ tục bạn có thể sử dụng được xây dựng trong chức năng current_setting('imos.testvar').

+0

Là những tùy chỉnh-biến-lớp học có thể thay đổi? – dacracot

+0

có, tôi có một lớp "imos" - đầu ra psql: imos => đặt imos.testvar thành 'foobar'; SET imos => hiển thị imos.testvar; imos.testvar -------------- foobar imos => đặt imos.testvar thành 'bazbar'; SET imos => hiển thị imos.testvar; imos.testvar -------------- bazbar –

+0

BTW, từ PostgreSQL 9.2 bất kỳ cài đặt nào có thể được đặt trước bởi bất kỳ tên lớp nào và hỗ trợ tham số custom_variable_classes đã bị xóa. (Xem https: // www.postgresql.org/docs/current/static/release-9-2.html#AEN111020) – Nashev

1

Đáng tiếc là không có biến toàn cầu trong PL/pgSQL, mặc dù bạn có thể tìm thấy những cái trong ngôn ngữ PL khác đi kèm với PostgreSQL, đặc biệt trong PL/Perl, PL/Python và PL/Tcl

4

Một lựa chọn khác sẽ được tạo một bảng tạm thời và sử dụng nó để lưu trữ tất cả các biến tạm thời của bạn

CREATE TEMPORARY TABLE tmp_vars( 
    name varchar(64), 
    value varchar(64), 
    PRIMARY KEY (name) 
); 

Bạn thậm chí có thể tạo một thủ tục được lưu trữ để quản lý mọi thứ, tạo bảng nếu chưa tồn tại. Một để truy xuất và một để lưu trữ.

1

Một ví dụ PL/pgsql kịch bản mà các cửa hàng và lấy các biến toàn cục từ một bảng:

CREATE TABLE global_vars (name TEXT PRIMARY KEY, value TEXT); 

CREATE FUNCTION put_var(key TEXT, data TEXT) RETURNS VOID AS ' 
    BEGIN 
    LOOP 
     UPDATE global_vars SET value = data WHERE name = key; 
     IF found THEN 
      RETURN; 
     END IF; 
     BEGIN 
      INSERT INTO global_vars(name,value) VALUES (key, data); 
      RETURN; 
     EXCEPTION WHEN unique_violation THEN 
      -- do nothing, and loop to try the UPDATE again 
     END; 
    END LOOP; 
    END; 
' LANGUAGE plpgsql; 

CREATE FUNCTION get_var(key TEXT) RETURNS TEXT AS ' 
    DECLARE 
    result TEXT; 
    BEGIN 
    SELECT value FROM global_vars where name = key INTO result; 
    RETURN result; 
    END; 
' LANGUAGE plpgsql; 


CREATE FUNCTION del_var(key TEXT) RETURNS VOID AS ' 
    BEGIN 
    DELETE FROM global_vars WHERE name = key; 
    END; 
' LANGUAGE plpgsql; 
Các vấn đề liên quan