2012-08-26 31 views
14

मैं SQLg को PostgreSQL में फ़ंक्शन ड्रॉप करना चाहता हूं। मैं DROP FUNCTION लिखता हूं और pg_proc से फ़ंक्शन का नाम प्राप्त करता हूं। यह समस्या नहीं है। हालांकि अगर मैं खाली पैरामीटर छोड़ देता हूं तो यह फ़ंक्शन को नहीं छोड़ देगा।फ़ंक्शन पैरामीटर सूचियां कैसे प्राप्त करें (इसलिए मैं एक फ़ंक्शन छोड़ सकता हूं)

मैंने मैन्युअल की जांच की और लिखा है कि मुझे इसे छोड़ने के लिए अपने पैरामीटर के साथ फ़ंक्शन की पहचान करनी है, उदाहरण के लिए DROP FUNCTION some_func(text,integer) न केवल DROP FUNCTION some_func

मुझे पैरामीटर कहां मिल सकता है? pg_proc तालिका में फ़ंक्शन की पंक्ति में कोई पैरामीटर नहीं है। तो मैं फंक्शन को छोड़ने के लिए एसक्यूएल कैसे प्राप्त कर सकता हूं?

+2

पीजीएडमिन के माध्यम से फ़ंक्शन को देखें। –

+2

'\ df name' के अंदर [' psql'] (http: //www.postgresql।org/docs/वर्तमान/स्थिर/एप्लिकेशन-psql.html)। –

उत्तर

24

पोस्टग्रेस के उस उद्देश्य के लिए एक समर्पित कार्य है। पोस्टग्रेस 8.4 के साथ पेश किया गया। The manual:

pg_get_function_identity_arguments(func_oid) ... (मूलभूत मूल्यों के बिना) एक समारोह की पहचान करने के तर्क सूची प्राप्त ...

pg_get_function_identity_arguments रिटर्न तर्क सूची एक समारोह की पहचान करने के रूप में यह आवश्यकता होगी आवश्यक उदाहरण के लिए ALTER FUNCTION के भीतर दिखाई देने के लिए। यह फ़ॉर्म डिफ़ॉल्ट मानों को छोड़ देता है।

SELECT format('DROP %s %I.%I(%s)' 
      , CASE WHEN p.proisagg THEN 'AGGREGATE' ELSE 'FUNCTION' END 
      , n.nspname 
      , p.proname 
      , pg_catalog.pg_get_function_identity_arguments(p.oid) 
      ) AS stmt 
FROM pg_catalog.pg_proc p 
JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace 
WHERE p.proname = 'dblink'      -- function name 
-- AND n.nspname = 'public'      -- schema name (optional) 
-- AND pg_catalog.pg_function_is_visible(p.oid) -- function visible to user 
ORDER BY 1; 

रिटर्न:

    stmt 
--------------------------------------------------- 
DROP FUNCTION public.dblink(text); 
DROP FUNCTION public.dblink(text, boolean); 
DROP FUNCTION public.dblink(text, text); 
DROP FUNCTION public.dblink(text, text, boolean); 

मिले चार

कि का उपयोग करना (और format(), Postgres 9.1 के साथ प्रस्तुत), निम्न क्वेरी कार्यों अपने खोज शब्दों से मेल खाते ड्रॉप करने DDL बयान उत्पन्न करता है उदाहरण में मेल खाता है क्योंकि dblink overloaded functions का उपयोग करता है।
रन DROP विवरण चुनिंदा रूप से!

-- SET LOCAL search_path = ''; -- optional, to get all names schema-qualified 
SELECT format('DROP %s %s;' 
      , CASE WHEN proisagg THEN 'AGGREGATE' ELSE 'FUNCTION' END 
      , oid::regprocedure 
      ) AS stmt 
FROM pg_catalog.pg_proc 
WHERE proname = 'dblink' -- function name 
ORDER BY 1; 
+2

.... और यही कारण है कि मुझे एसओ पसंद है। 4 साल की तरह कुछ के लिए पीजी का उपयोग करना और मैं इसके बारे में कभी नहीं जानता था। मिठाई। –

+0

बहुत बहुत धन्यवाद, यह वही है जो मैं देख रहा हूं। महान! – John

1

उपयोग pgadminIII और समारोह सूची के लिए सीधी पहुँच और सही इसे क्लिक करें फिर चुनें:

वैकल्पिक रूप से, आप object identifier type regprocedure जो तर्क प्रकार सहित एक पूरा समारोह हस्ताक्षर रिटर्न के लिए सुविधाजनक डाली उपयोग कर सकते हैं enter image description here

0

यदि आप पोस्टग्रेज़ के पुराने पुराने संस्करण पर काम कर रहे हैं, जिसके लिए pg_get_function_identity_arguments (func_oid) मौजूद नहीं है, तो मैं अपना स्वयं का फ़ंक्शन समानता प्राप्त करता हूं फ़ंक्शन से टियर, आपको केवल फ़ंक्शन के लिए ओड पास करने की आवश्यकता है, आपको नीचे दिए गए फ़ंक्शन को अपने पोस्टग्रेस डीबी पर तैनात करने की आवश्यकता है।

CREATE OR REPLACE FUNCTION public.getFunctionParameter(functionOid oid) 
    RETURNS text AS 
$BODY$ 

declare 
    t_paras text; 
    paras oid[]; 
    res text :='('; 
begin 

select proargtypes into t_paras from pg_proc where oid=functionOid; 
if t_paras is null or t_paras='' then 
    return '()'; 
else 
    paras:=string_to_array(t_paras,' '); 
    for i in array_lower(paras,1) .. array_upper(paras,1) 
    loop 
     raise notice 'para is %',paras[i]; 
     select format_type(paras[i]::oid,NULL) into t_paras; 
     res:=res||t_paras||','; 
    end loop; 
    res:=substring(res from 1 for char_length(res)-1); 
    res:=res||')'; 
    return res; 
end if; 

end 

    $BODY$ 
     LANGUAGE plpgsql ; 

समारोह नीचे समारोह नाम और पैरामीटर सूची जाएगा, स्कीमा का नाम बदलने के लिए, मैं उदाहरण

SELECT n.nspname||'.'||p.proname||public.getFunctionParameter(p.oid) 
FROM pg_proc p JOIN pg_namespace n ON n.oid = p.pronamespace 
WHERE n.nspname='public' 

आप परिणाम होगा के लिए सार्वजनिक उपयोग कर रहा हूँ कुछ अन्य स्कीमा के तहत समारोह प्राप्त करना चाहते हैं, तो

1 "public.getfunctionparameter(integer,text)" 
2 "public.getfunctionparameter(oid)"