2009-01-05 19 views
9

ओरेकल के पीएल/एसक्यूएल में मैं पैकेज परिभाषा के साथ एक सत्र आधारित वैश्विक चर बना सकता हूं। पोस्टग्रेस्क्ल के पीएलजीपी/एसक्यूएल के साथ, यह संभव नहीं लगता है क्योंकि कोई पैकेज नहीं है, केवल स्वतंत्र प्रक्रियाएं और कार्य हैं।पोस्टग्रेस्क्ल संग्रहीत प्रक्रिया में सत्र आधारित वैश्विक चर?

यहाँ पी एल के लिए वाक्यविन्यास/एसक्यूएल 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/एसक्यूएल के साथ वैश्विक चर आधारित एक सत्र को लागू करेंगे?

उत्तर

1
Postgresql forums से

...

तो, सवाल की एक जोड़ी ....

  1. आप plpgsql से वैश्विक मूल्यों की घोषणा कर सकते हैं?
  2. यदि हां, तो नामस्थान प्रदूषण से बचने का कोई तरीका है? (शायद plsql पैकेज के ओरेकल के उपयोग के बराबर चर)

plpgsql वैश्विक चर नहीं है।

6

आप में कुछ कस्टम चर-वर्गों को परिभाषित कर सकता है your 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

+0

हाँ, मेरे पास एक वर्ग "आईएमओएस" है - psql आउटपुट: imos => imos.testvar को 'foobar' पर सेट करें; एसईटी आईएमओएस => imos.testvar दिखाएं; आईएमओएस।testvar -------------- foobar imos => imos.testvar को 'bazbar' पर सेट करें; एसईटी आईएमओएस => imos.testvar दिखाएं; imos.testvar -------------- बज़बार –

+0

बीटीडब्लू, पोस्टग्रेएसक्यूएल 9.2 से किसी भी सेटिंग को किसी भी वर्ग के नाम से प्रीफिक्स किया जा सकता है और custom_variable_classes पैरामीटर का समर्थन हटा दिया गया था। (Https: // देखें www.postgresql.org/docs/current/static/release-9-2.html#AEN111020) – Nashev

1

दुर्भाग्य से PL/pgSQL में कोई वैश्विक चर, यद्यपि आप अन्य पी एल भाषाओं कि PostgreSQL के साथ आते हैं में लोगों को मिल सकता है विशेष रूप से PL/Perl में हैं,, पी एल/अजगर और पी एल/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; 
संबंधित मुद्दे