2012-07-13 11 views
9

पर लौटने के लिए मेरे पास PostgreSQL 8.4 में संग्रहीत प्रक्रिया है जो एक पैरामीटर के रूप में पारित पूर्णांक मान के आधार पर एक और संग्रहीत प्रक्रिया को कॉल करता है। उन संग्रहित प्रक्रियाओं को ऐसे कहा जाता है कि उन्हें एक पूर्णांक कॉलम के साथ संबंध वापस करना चाहिए। मेरी समस्या यह है कि बाहरी संग्रहित प्रक्रिया हमेशा पंक्तियों की सही संख्या के साथ संबंध रखती है लेकिन सभी आईडी के पूर्ण के साथ।पुनर्नवीनीकरण तालिका (आईडी पूर्णांक) के साथ PostgreSQL संग्रहीत प्रक्रिया सभी NULLs

यहाँ संग्रहीत प्रक्रिया इसके सरलतम रूप के लिए कम हो जाता है:

CREATE OR REPLACE FUNCTION spa(count integer) 
RETURNS TABLE (id integer) AS $$ 
BEGIN 
    RETURN QUERY SELECT generate_series(1, count); 
END; 
$$ LANGUAGE plpgsql; 

CREATE OR REPLACE FUNCTION spb(count integer) 
RETURNS TABLE (id integer) AS $$ 
BEGIN 
    RETURN QUERY SELECT generate_series(1, count); 
END; 
$$ LANGUAGE plpgsql; 

CREATE OR REPLACE FUNCTION conditional_relation_return(objectType integer, count integer) 
RETURNS TABLE (id integer) AS $$ 
BEGIN 
    IF objectType = 1 THEN 
     RETURN QUERY SELECT id FROM spa(count); 
    ELSIF objectType = 2 OR objectType = 3 THEN 
     RETURN QUERY SELECT id FROM spb(count); 
    END IF; 

END; 
$$ LANGUAGE plpgsql; 

और यदि आप इसे कहते हैं:

# select * from conditional_relation_return(1, 2); 
id 
---- 


(2 rows) 

या अधिक विशेष रूप से:

# select count(*) from conditional_relation_return(1, 2) where id is null; 
count 
------- 
    2 
(1 row) 

लेकिन अगर आप फोन संदर्भित संग्रहीत प्रक्रियाओं में से एक, आपको सही परिणाम मिलते हैं:

# select * from spa(2); 
id 
---- 
    1 
    2 
(2 rows) 

तो क्यों conditional_relation_return सभी एनयूएलएल वापस करता है?

उत्तर

13

आउट पैरामीटर आईडी (RETURNS TABLE (id integer)) के साथ स्पा विवादों के id। Postgresql 8.4 शिकायत नहीं करता है, यह सैनिअर (स्पा की आईडी) के बजाय पैरामीटर आईडी से आईडी चुनता है।

Postgresql 9.1 के अपने मूल कोड पर शिकायत:

ERROR: column reference "id" is ambiguous 
LINE 1: SELECT id FROM spa(count) 
      ^
DETAIL: It could refer to either a PL/pgSQL variable or a table column. 
QUERY: SELECT id FROM spa(count) 
CONTEXT: PL/pgSQL function "conditional_relation_return" line 4 at RETURN QUERY 

इसे ठीक करने के लिए, पूरी तरह से आपकी क्वेरी पर आईडी अर्हता:

CREATE OR REPLACE FUNCTION conditional_relation_return(
    objectType integer, count integer) 
RETURNS TABLE (id integer) AS $$ 
BEGIN 
    IF objectType = 1 THEN 
     RETURN QUERY SELECT x.id FROM spa(count) as x; 
    ELSIF objectType = 2 OR objectType = 3 THEN 
     RETURN QUERY SELECT x.id FROM spb(count) as x; 
    END IF; 

END; 
$$ LANGUAGE plpgsql; 

आउटपुट:

test=# select * from conditional_relation_return(1, 2); 
id 
---- 
    1 
    2 
(2 rows) 

पोस्टग्रेस्क्ल कॉलम (ओं) नाम y का सम्मान करता है कहां अपने RETURNS TABLE से चुनें। यह अभी भी x.id को आपके RETURNS TABLE के id पर स्लॉट करें। इसलिए, आपने अपने RETURNS TABLE रिटर्न कॉलम के नाम का नाम बदलने का भी निर्णय लिया है, फिर भी वह उस नाम पर x.id स्लॉट करेगा, उदा।

CREATE OR REPLACE FUNCTION conditional_relation_return(
    objectType integer, count integer) 
RETURNS TABLE (hahah integer) AS $$ 
BEGIN 
    IF objectType = 1 THEN 
     RETURN QUERY SELECT x.id FROM spa(count) as x; 
    ELSIF objectType = 2 OR objectType = 3 THEN 
     RETURN QUERY SELECT x.id FROM spb(count) as x; 
    END IF; 

END; 
$$ LANGUAGE plpgsql; 

आउटपुट:

test=# select * from conditional_relation_return(1, 2); 
hahah 
------- 
    1 
    2 
(2 rows) 

सूचना hahah स्तंभ

+0

कैसे हास्यास्पद। तुम सही हो। 8.4 चुपचाप संदिग्ध आईडी त्रुटि निगलता है। धन्यवाद! – drsnyder

संबंधित मुद्दे