2013-01-31 42 views
5

में डेटा वापस नहीं मैं जो एक मेज लौटा रहा है एक Postgres कार्य हो:Postgres समारोह लौटने तालिका स्तंभ

पंक्ति और स्तंभ के रूप में
CREATE OR REPLACE FUNCTION testFunction() RETURNS TABLE(a int, b int) AS 
$BODY$ 
DECLARE a int DEFAULT 0; 
DECLARE b int DEFAULT 0; 
BEGIN 
CREATE TABLE tempTable AS SELECT a, b; 
RETURN QUERY SELECT * FROM tempTable; 
DROP TABLE tempTable; 
END; 
$BODY$ 
LANGUAGE plpgsql; 

यह समारोह नहीं लौटा रहा है डेटा। इसके बजाए यह डेटा लौटाता है:

(0,0) 

इससे डेटा निकालने में कोल्डफ्यूजन सीएफक्वायरी ब्लॉक में समस्या आ रही है। जब इस फ़ंक्शन से कोई तालिका वापस आती है तो मैं पंक्तियों और स्तंभों में डेटा कैसे प्राप्त करूं? दूसरे शब्दों में: पीएल/पीजीएसक्यूएल फ़ंक्शन कॉलम के रूप में डेटा क्यों नहीं लौटाता है?

+0

आप temp तालिका का उपयोग क्यों कर रहे हैं? यह पूरी तरह से अनावश्यक है और बिना किसी फायदे के चीजों को धीमा कर देता है (और आप एक सरल 'एसक्यूएल' फ़ंक्शन का उपयोग कर सकते हैं जो चीजों को थोड़ा तेज कर देगा) –

उत्तर

10

, पंक्ति लिखने के बजाय अलग-अलग स्तंभों पाने के साथ समारोह कॉल करने के लिए:

SELECT * FROM testfunction(); 

वैसे ही जैसे आप एक मेज से सभी स्तंभों का चयन होगा।

CREATE OR REPLACE FUNCTION testfunction() 
    RETURNS TABLE(a int, b int) AS 
$func$ 
DECLARE 
    _a int := 0; 
    _b int := 0; 
BEGIN 
    CREATE TEMP TABLE tbl AS SELECT _a, _b; 
    RETURN QUERY SELECT * FROM tbl; 
    DROP TABLE tempTable; 
END 
$func$ LANGUAGE plpgsql; 

विशेष रूप से:

  • DECLARE कुंजी शब्द केवल एक बार की जरूरत है
    इसके अलावा अपने परीक्षण समारोह के इस समीक्षा की फार्म पर विचार करें।
  • RETURNS TABLE (...) खंड में OUT पैरामीटर के रूप में घोषित पैरामीटर घोषित करने से बचें (अंतर्निहित रूप से)।
  • पोस्टग्रेज़ में अनगिनत CaMeL-case पहचानकर्ताओं का उपयोग न करें। यह काम करता है, unquoted पहचानकर्ता कम मामले में एक कलाकार, लेकिन यह भ्रमित त्रुटियों की ओर जाता है। (शायद अति सरल)

देखें अस्थायी तालिका उदाहरण में पूरी तरह से बेकार है। आप इसे कम कर सकते हैं:

CREATE OR REPLACE FUNCTION testfunction(OUT a int, OUT b int) AS 
$func$ 
BEGIN 
    a := 0; 
    b := 0; 
END 
$func$ LANGUAGE plpgsql; 
+0

इसका सही और उत्तर के लिए धन्यवाद। –