2009-01-05 43 views
9

在Oracle的PL/SQL中,我可以使用包定義創建基於會話的全局變量。對於Postgresql的PLpg/SQL,由於沒有軟件包,只有獨立的程序和功能,所以似乎不可能。Postgresql存儲過程中基於會話的全局變量?

下面是語法的PL/SQL聲明g_spool_key作爲全球...

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; 

如何我會實現基於全局變量與PLPG/SQL會話?

回答

1

Postgresql forums ...

所以,幾個問題....

  1. 你能從PLPGSQL聲明全局值?
  2. 如果是這樣,是否有避免命名空間污染的方法? (也許相當於Oracle的使用PLSQL包 變量)

PLPGSQL沒有全局變量。

6

你可以在定義一些自定義的變量類你的postgresql.conf並將它用作存儲過程中的連接變量。請參閱docs。自定義變量級「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) 

在存儲,程序,你可以使用內置的功能current_setting('imos.testvar')

+0

是這些自定義變量類易變? – dacracot 2009-01-06 19:30:26

1

不幸的是在PL/pgSQL裏沒有全局變量,但你可以找到在附帶的PostgreSQL其他PL語言的人,特別是在PL/Perl,PL/Python和PL/Tcl的

4

另一種選擇是創建一個臨時表,並用它來存儲所有臨時變量

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

你甚至可以創建一個存儲過程來管理一切,創建表,如果它不存在。一個用於檢索,另一個用於存儲。

1

一個例子PL/pgsql腳本存儲和從表中檢索全局變量:

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;