मैं PostgreSQL में किसी विशेष स्कीमा के डेटाबेस में संग्रहीत सभी फ़ंक्शन की सूची कैसे प्राप्त कर सकता हूं?


135

मैं एक PostgreSQL डेटाबेस से कनेक्ट करने और किसी विशेष स्कीमा के लिए सभी फ़ंक्शन ढूंढने में सक्षम होना चाहता हूं।

मेरा विचार था कि मैं pg_catalog या information_schema के लिए कुछ क्वेरी कर सकता हूं और सभी फ़ंक्शन की सूची प्राप्त कर सकता हूं, लेकिन मैं यह पता नहीं लगा सकता कि नाम और पैरामीटर कहाँ संग्रहीत हैं। मैं एक क्वेरी की तलाश कर रहा हूं जो मुझे फ़ंक्शन का नाम और इसे लेने वाले पैरामीटर प्रकार (और यह उन्हें किस क्रम में लेती है) देगी।

क्या इसे करने का कोई तरीका है?

जवाबों:


191
\df <schema>.*

में psqlआवश्यक जानकारी देता है।

उस क्वेरी को देखने के लिए जिसका उपयोग आंतरिक रूप से डेटाबेस से कनेक्ट करने psqlऔर अतिरिक्त " -E" (या " --echo-hidden") विकल्प प्रदान करने के लिए किया गया है और फिर उपरोक्त कमांड को निष्पादित करें।


1
क्या आप उस क्वेरी में पेस्ट कर सकते हैं?
रुड ज़्वोलिंस्की

3
"स्कीमा" के रूप में n.nspname का चयन करें, "नाम" के रूप में p.proname, "परिणाम डेटा प्रकार" के रूप में pg_catalog.pg_get_function_result (p.oid), pg_catalog.pg_get_function_arguments (p.oid) के रूप में "तर्क डेटा प्रकार", CASE WHEN .proisagg THEN 'agg' WHEN p.proiswindow THEN 'विंडो' WHEN p.prorettype = 'pg_catalog.trigger' :: pg_catalog.regtype THEN 'ट्रिगर' ELSE 'नॉर्मल' END को "टाइप करें" FROM pg_catalog.pg_proc p LEFT JOIN_IN .pg_namespace n ON n.oid = p.pronamespace WHERE n.nspname ~ '^ (public) $' ORDER BY 1, 2, 4; ऊपर क्वेरी उत्पन्न ('सेट ECHO_HIDDEN' से ') है।
साइमन डी

90

कुछ खोज के बाद, मैं information_schema.routinesतालिका और information_schema.parametersतालिकाओं को खोजने में सक्षम था । उन का उपयोग करते हुए, कोई इस उद्देश्य के लिए एक क्वेरी का निर्माण कर सकता है। JOIN के बजाय LEFT JOIN, मापदंडों के बिना कार्यों को पुनः प्राप्त करने के लिए आवश्यक है।

SELECT routines.routine_name, parameters.data_type, parameters.ordinal_position
FROM information_schema.routines
    LEFT JOIN information_schema.parameters ON routines.specific_name=parameters.specific_name
WHERE routines.specific_schema='my_specified_schema_name'
ORDER BY routines.routine_name, parameters.ordinal_position;

2
आप oidvectortypesवास्तव में उपयोगी भी पाएंगे । नया जवाब देखें: stackoverflow.com/a/24034604/398670
क्रेग रिंगर

ऊपर दिए गए कोड में सभी फ़ंक्शंस नहीं दिखेंगे, आपको JOIN के बजाय LEFT JOIN की ज़रूरत है, साथ ही बिना किसी इनपुट पैरामीटर के फ़ंक्शंस दिखाने के लिए।
डेविड

35

यदि कोई भी यहां रुचि रखता है, तो यह प्रश्न क्या होता है, जो पोस्ट psql9.1 पर पोस्ट किया गया है:

SELECT n.nspname as "Schema",
  p.proname as "Name",
  pg_catalog.pg_get_function_result(p.oid) as "Result data type",
  pg_catalog.pg_get_function_arguments(p.oid) as "Argument data types",
 CASE
  WHEN p.proisagg THEN 'agg'
  WHEN p.proiswindow THEN 'window'
  WHEN p.prorettype = 'pg_catalog.trigger'::pg_catalog.regtype THEN 'trigger'
  ELSE 'normal'
 END as "Type"
FROM pg_catalog.pg_proc p
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE pg_catalog.pg_function_is_visible(p.oid)
      AND n.nspname <> 'pg_catalog'
      AND n.nspname <> 'information_schema'
ORDER BY 1, 2, 4;

आप ध्वज के साथ psqlचलकर एक बैकस्लैश कमांड के लिए क्या प्राप्त कर सकते हैं ।psql-E


बस आपके उत्तर में आया और पोस्टग्रेज 11.5 पर क्वेरी की कोशिश की। यह कहता है:ERROR: column p.proisagg does not exist
क्रिस्टियान Westerbeek

इसके लिए धन्यवाद; दो शीर्ष मतदान के जवाबों ने मेरा काम नहीं दिखाया!
मशीनघोस्ट

29

एक आसान कार्य है oidvectortypes, जो इसे बहुत आसान बनाता है।

SELECT format('%I.%I(%s)', ns.nspname, p.proname, oidvectortypes(p.proargtypes)) 
FROM pg_proc p INNER JOIN pg_namespace ns ON (p.pronamespace = ns.oid)
WHERE ns.nspname = 'my_namespace';

इंगित करने के लिए पोस्टग्रेज ऑनलाइन में लियो हूस और रेजिना ओबे को श्रेय oidvectortypes। मैंने पहले भी इसी तरह के कार्यों को लिखा था, लेकिन जटिल नेस्टेड अभिव्यक्तियों का उपयोग किया था जो इस फ़ंक्शन की आवश्यकता से छुटकारा दिलाता है।

संबंधित उत्तर देखें


(2016 में संपादित करें)

विशिष्ट रिपोर्ट विकल्पों को सारांशित करना:

-- Compact:
SELECT format('%I.%I(%s)', ns.nspname, p.proname, oidvectortypes(p.proargtypes))

-- With result data type: 
SELECT format(
       '%I.%I(%s)=%s', 
       ns.nspname, p.proname, oidvectortypes(p.proargtypes),
       pg_get_function_result(p.oid)
)

-- With complete argument description: 
SELECT format('%I.%I(%s)', ns.nspname, p.proname, pg_get_function_arguments(p.oid))

-- ... and mixing it.

-- All with the same FROM clause:
FROM pg_proc p INNER JOIN pg_namespace ns ON (p.pronamespace = ns.oid)
WHERE ns.nspname = 'my_namespace';

सूचना : p.proname||'_'||p.oid AS specific_name अद्वितीय नाम प्राप्त करने के लिए उपयोग करें, या information_schemaतालिकाओं के साथ शामिल होने के लिए - देखें routinesऔर parameters@ RuddZwolinski के उत्तर पर।


फ़ंक्शन का OID (देखें  pg_catalog.pg_proc) और फ़ंक्शन का specific_name (देखें  information_schema.routines) फ़ंक्शन के लिए मुख्य संदर्भ विकल्प हैं। नीचे, रिपोर्टिंग और अन्य संदर्भों में कुछ उपयोगी कार्य।

--- --- --- --- ---
--- Useful overloads: 

CREATE FUNCTION oidvectortypes(p_oid int) RETURNS text AS $$
    SELECT oidvectortypes(proargtypes) FROM pg_proc WHERE oid=$1;
$$ LANGUAGE SQL IMMUTABLE;

CREATE FUNCTION oidvectortypes(p_specific_name text) RETURNS text AS $$
    -- Extract OID from specific_name and use it in oidvectortypes(oid).
    SELECT oidvectortypes(proargtypes) 
    FROM pg_proc WHERE oid=regexp_replace($1, '^.+?([^_]+)$', '\1')::int;
$$ LANGUAGE SQL IMMUTABLE;

CREATE FUNCTION pg_get_function_arguments(p_specific_name text) RETURNS text AS $$
    -- Extract OID from specific_name and use it in pg_get_function_arguments.
    SELECT pg_get_function_arguments(regexp_replace($1, '^.+?([^_]+)$', '\1')::int)
$$ LANGUAGE SQL IMMUTABLE;

--- --- --- --- ---
--- User customization: 

CREATE FUNCTION pg_get_function_arguments2(p_specific_name text) RETURNS text AS $$
    -- Example of "special layout" version.
    SELECT trim(array_agg( op||'-'||dt )::text,'{}') 
    FROM (
        SELECT data_type::text as dt, ordinal_position as op
        FROM information_schema.parameters 
        WHERE specific_name = p_specific_name 
        ORDER BY ordinal_position
    ) t
$$ LANGUAGE SQL IMMUTABLE;

pronameनाम है, लेकिन कैसे के लिए, जैसे OID प्राप्त करने के लिए है। में उपयोग करें pg_catalog.pg_get_function_result(oid))?
पीटर क्रस

1
@PeterKrauss का oidकॉलम pg_proc। यह एक छिपा हुआ स्तंभ है।
क्रेग रिंगर

1
एक्सटेंशन-डिपेंडेंट फ़ंक्शंस (जैसे PostGg से फ़ंक्शंस) को बाहर करने के लिए stackoverflow.com/a/25388031/161040 भी देखें ।
साइमन डी

20

एक दृश्य बनाने के लिए SQL क्वेरी के नीचे चलाएँ, जो सभी फ़ंक्शन दिखाएगा:

CREATE OR REPLACE VIEW show_functions AS
    SELECT routine_name FROM information_schema.routines 
        WHERE routine_type='FUNCTION' AND specific_schema='public';

10

एक अच्छा विचार है जिसका नाम सांप्रदायिक उर्फ ​​के साथ काम करता है, पहले शब्द पर नाम के साथ LIKE उदाहरण के लिए सार्वजनिक स्कीमा के साथ Postgresql 9.4, उसकी योजना के साथ प्रतिस्थापित करना सुनिश्चित करें

SELECT routine_name 
FROM information_schema.routines 
WHERE routine_type='FUNCTION' 
  AND specific_schema='public'
  AND routine_name LIKE 'aliasmyfunctions%';

4

उदाहरण:

perfdb-# \df information_schema.*;

List of functions
        Schema      |        Name        | Result data type | Argument data types |  Type  
 information_schema | _pg_char_max_length   | integer | typid oid, typmod integer | normal
 information_schema | _pg_char_octet_length | integer | typid oid, typmod integer | normal
 information_schema | _pg_datetime_precision| integer | typid oid, typmod integer | normal
 .....
 information_schema | _pg_numeric_scale     | integer | typid oid, typmod integer | normal
 information_schema | _pg_truetypid         | oid     | pg_attribute, pg_type     | normal
 information_schema | _pg_truetypmod        | integer | pg_attribute, pg_type     | normal
(11 rows)

5
एक ऐसा कैसे है जो मिलन के जवाब से अलग है?
a_horse_with_no_name

3
यह एक क्वेरी नहीं है, इसकी एक psqlपोस्टग्रेज क्लाइंट इंटरफ़ेस की एक कमांड है । यह केवल कार्य करेगा psqlऔर तकनीकी रूप से SQL क्वेरी नहीं है।
ग्रेग

3

Function_schema और function_name की सूची प्राप्त करें ...


> select n.nspname as function_schema,
> 
> p.proname as function_name
> 
> from pg_proc p
> 
> left join pg_namespace n on p.pronamespace = n.oid
> 
> where n.nspname not in ('pg_catalog', 'information_schema')
> 
> order by function_schema, function_name;

2

यह फ़ंक्शन वर्तमान डेटाबेस में सभी उपयोगकर्ता परिभाषित दिनचर्या लौटाता है।

SELECT pg_get_functiondef(p.oid) FROM pg_proc p
INNER JOIN pg_namespace ns ON p.pronamespace = ns.oid
WHERE ns.nspname = 'public';
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.