2012-03-13 12 views
8

क्या मैं पागल हूं या सिर्फ सादा गूंगा हूं?"फ़ंक्शन मौजूद नहीं है," लेकिन मुझे सच में लगता है कि यह

dev=# \df abuse_resolve 
List of functions 
-[ RECORD 1 ]-------+------------------------------------------------------------------------------------------------------------------------------------ 
Schema    | public 
Name    | abuse_resolve 
Result data type | record 
Argument data types | INOUT __abuse_id bigint, OUT __msg character varying 
Type    | normal 

dev=# select abuse_resolve('30'::bigint); 
ERROR: function abuse_resolve(bigint) does not exist 
LINE 1: select abuse_resolve('30'::bigint); 
      ^
HINT: No function matches the given name and argument types. You might need to add explicit type casts. 

यहाँ CREATE FUNCTION है, मैं कोड का मांस हटा दिया है, लेकिन वह अप्रासंगिक होना चाहिए:

CREATE OR REPLACE FUNCTION abuse_resolve(INOUT __abuse_id bigint, OUT __msg character varying) RETURNS record AS $_$ 
DECLARE 
    __abuse_status VARCHAR; 
BEGIN 
...snip... 
    UPDATE abuse SET abuse_status = __abuse_status, 
         edate = now(), 
         closed_on = now() 
       WHERE abuse_id  = __abuse_id; 
    __msg = 'SUCCESS'; 
END; 
$_$ LANGUAGE plpgsql SECURITY DEFINER; 

और बस गिगल्स के लिए:

GRANT ALL ON FUNCTION abuse_resolve(INOUT __abuse_id, OUT __msg character varying) TO PUBLIC; 
GRANT ALL ON FUNCTION abuse_resolve(INOUT __abuse_id, OUT __msg character varying) TO myuser; 

कि समारोह की तरह लगता है वह मौजूद है। मैं क्या लापता हो सकता है?

यह हल हो गया है, जवाब है: मैं गूंगा हूँ। मैंने मूल रूप से तर्कों को अनुचित रूप से परिभाषित किया था, लेकिन मेरा कोड सही लोगों का उपयोग कर रहा था। एक अतिरिक्त bigint था जिसमें कोई व्यवसाय नहीं था।

+1

निर्दिष्ट फोन में स्थापित करने के लिए सलाह देते हैं? –

+0

क्या आपने एक ही सत्र में दोनों को निष्पादित किया था? वही उपयोगकर्ता? वही search_path? –

+0

हां, केवल एक उपयोगकर्ता है। search_path सार्वजनिक पर सेट है, दिखाएं यह पुष्टि करता है। मैं क्रिएट फंक्शन – echtish

उत्तर

2

ठीक है, कुछ अजीब है। मैंने किया था:

[email protected]@[local] =# create function abuse_resolve(inout __abuse_id bigint, 
           out __msg text) returns record language plpgsql as 
           $$ begin __msg = 'ok'; end; $$; 
CREATE FUNCTION 
[email protected]@[local] =# \df abuse_resolve 
List of functions 
-[ RECORD 1 ]-------+---------------------------------------- 
Schema    | so9679418 
Name    | abuse_resolve 
Result data type | record 
Argument data types | INOUT __abuse_id bigint, OUT __msg text 
Type    | normal 

[email protected]@[local] =# select abuse_resolve('30'::bigint); 
-[ RECORD 1 ]-+-------- 
abuse_resolve | (30,ok) 

आप इस डेटाबेस में कोई अन्य समस्या था? क्या आप इसे डंप/पुनर्स्थापित कर सकते हैं और इसे नई प्रतिलिपि पर आजमा सकते हैं? स्पष्ट रूप से "सार्वजनिक" स्कीमा सहायता के साथ फ़ंक्शन नाम को अर्हता प्राप्त कर रहा है? आप PostgreSQL का कौन सा संस्करण उपयोग कर रहे हैं?

अद्यतन: एसक्यूएल समारोह यह भी मेरे लिए ठीक काम किया का उपयोग कर:

create function abuse_resolve(inout __abuse_id bigint, out __msg text) 
    language sql as $$ select $1, 'ok'::text $$; 
+0

मैं @echtish को 'रिटर्न रिकॉर्ड' के बिना एसक्यूएल के रूप में फ़ंक्शन बनाने में सक्षम था। तब मैंने आपके नमूने को plpgsql के रूप में देखा और अपना खुद का गिरा दिया और अपना बनाया और यह काम किया। फिर तुम्हारा गिरा दिया और अब मैं उसी कार्य के साथ अब समस्या को पुन: पेश नहीं कर सकता जिसके साथ मैं पहली बार समस्या का पुनरुत्पादन कर रहा था। मैं फेडोरा 16 –

+0

पर 9.1 का उपयोग कर रहा हूं केवल समझदार स्पष्टीकरण यह है कि 'search_path' में' public' स्कीमा शामिल नहीं है। मैं शर्त लगाता हूं कि 'public.abuse_resolve ('30' :: bigint) का चयन करें; 'काम करता है। –

+0

@Clodoaldo: मैं इसे किसी भी SQL फ़ंक्शन का उपयोग करके पुन: उत्पन्न नहीं कर सकता (9.1, डेबियन) – araqnid

1

इस वाक्य का प्रयास करें:

SELECT * FROM abuse_resolve('30'::bigint); 
+0

धन्यवाद के साथ संपादित करूंगा, लेकिन कोई खुशी नहीं। फिर भी, 'त्रुटि: फ़ंक्शन दुरुपयोग_resolve (bigint) मौजूद नहीं है – echtish

+0

-1' इस मामले में आवश्यक 'से चुनें' –

2

आप कर सकते हैं और अगर है कि समस्या है। मैं तुम्हें पोस्ट कर सकते हैं `function` बयान बनाने

"set search_path = mainSchemaName, secondOnes" 

उपयोग करने के लिए सही स्कीमा समारोह या बनाई गई है जहां एक जगह है जहाँ आप इसे सीधे स्कीमा नाम

select schemaName.abuse_resolve('30'::bigint); 
+0

यह है। यहीं।मैं अपने कार्यक्षेत्र से पहले अपने स्कीमा नाम को परिभाषित करना भूल गया था और यह काम नहीं कर रहा था। धन्यवाद! –

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