পোস্টগ্রিএসকিউএল-তে একটি বিশেষ স্কিমা ডাটাবেসে সংরক্ষিত সমস্ত ফাংশনের একটি তালিকা আমি কীভাবে পেতে পারি?


135

আমি একটি পোস্টগ্রিজ এসকিউএল ডাটাবেসে সংযোগ করতে এবং একটি বিশেষ স্কিমাটির জন্য সমস্ত ফাংশন সন্ধান করতে সক্ষম হতে চাই।

আমার ধারণা ছিল যে আমি pg_catolog বা তথ্য_স্কেমার জন্য কিছু জিজ্ঞাসা করতে এবং সমস্ত ফাংশনগুলির একটি তালিকা পেতে পারি তবে নাম এবং পরামিতিগুলি কোথায় সঞ্চিত তা আমি বুঝতে পারি না। আমি একটি ক্যোয়ারী খুঁজছি যা আমাকে ফাংশনটির নাম এবং প্যারামিটারের যে ধরণের লাগে তা দেয় (এবং এটি তাদের কী অর্ডার করে)।

এই কাজ করতে একটি উপায় আছে কি?

উত্তর:


191
\df <schema>.*

ইন psqlপ্রয়োজনীয় তথ্য দেয়।

অভ্যন্তরীণভাবে ব্যবহৃত কোয়েরিটি দেখতে psqlএকটি " -E" (বা " --echo-hidden") বিকল্পের সাথে একটি ডাটাবেসের সাথে সংযোগ স্থাপন করুন এবং তারপরে উপরের কমান্ডটি কার্যকর করুন।


1
আপনি কি সেই প্রশ্নটি পেস্ট করতে পারেন?
রুড জুইলিনস্কি

3
"স্কিমা" হিসাবে এন.এস.পি. নাম, "নাম" হিসাবে p.proname, pg_catolog.pg_get_function_result (p.oid) "ফলাফল তথ্য টাইপ" হিসাবে, pg_catolog.pg_get_function_arguments (p.oid) "আর্গুমেন্ট তথ্য প্রকার" হিসাবে, CASE WHEN p .প্রিয়স্যাগ তি 'আগ্রাসিত' WHEN p.proiswindow THEN 'উইন্ডো' WHEN p.proreTPpe = 'pg_catolog.trigger' :: pg_catolog.regtype THEN 'ট্রিগার' ELSE 'স্বাভাবিক' END "টাইপ" থেকে "টাইপ করুন" PG_catolog.pg_proc p LEFC JOING .pg_namespace n ON n.oid = p.pronamespace WHNE n.nspname ~ '^ (সর্বজনীন) 1' 1, 2, 4 দ্বারা অর্ডার; উপরে উত্পন্ন ক্যোয়ারী রয়েছে (E সেট ECHO_HIDDEN থেকে 'চালু করুন')।
সাইমন ডি

90

কিছু অনুসন্ধানের পরে, আমি information_schema.routinesটেবিল এবং information_schema.parametersটেবিলগুলি সন্ধান করতে সক্ষম হয়েছি । এগুলি ব্যবহার করে, কেউ এই উদ্দেশ্যে একটি প্রশ্ন তৈরি করতে পারে। বাম যোগ যোগদানের পরিবর্তে, যোগগুলির পরিবর্তে, পরামিতি ছাড়াই ফাংশনগুলি পুনরুদ্ধার করা প্রয়োজন।

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সত্যিই দরকারী পাবেন । নতুন উত্তর দেখুন: স্ট্যাকওভারফ্লো.com
ক্রেগ রিঞ্জার

উপরের কোডটি সমস্ত ফাংশন প্রদর্শন করবে না, কোনও ইনপুট প্যারামিটার ছাড়াও ফাংশনগুলি দেখানোর জন্য আপনাকে জিনের পরিবর্তে একটি বাম জয়েন্ট দরকার।
ডেভিড

35

এখানে যদি কেউ আগ্রহী psqlহয় তবে পোস্ট কোষ 9.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


স্রেফ আপনার উত্তর জুড়ে এসে পোস্টগ্রিজ ১১.৫-তে কোয়েরিটি চেষ্টা করে দেখেছেন। এতে বলা হয়েছে:ERROR: column p.proisagg does not exist
ক্রিশ্চিয়ান ওয়েস্টারবিইক

এর জন্য ধন্যবাদ; দুটি শীর্ষ ভোটের উত্তর আমার ফাংশনটি দেখায় নি!
মেশিনহোস্ট

29

একটি সহজ কাজ আছে, oidvectortypesএটি এটিকে অনেক সহজ করে তোলে makes

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';

লিও হু এবং রেগিনা ওবে পোস্টগ্রিস অনলাইন এ ক্রেডিট করার জন্য poinoidvectortypes । আমি আগে অনুরূপ ফাংশন লিখেছি, কিন্তু জটিল নেস্টেড এক্সপ্রেশন ব্যবহার করেছি যা এই ফাংশনটির প্রয়োজনীয়তা থেকে মুক্তি পায়।

সম্পর্কিত উত্তর দেখুন


(২০১ 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@ রুডজওয়ালিনস্কির উত্তর দেখুন।


ফাংশনের ওআইডি (দেখুন  pg_catalog.pg_proc) এবং ফাংশনের নির্দিষ্ট_নাম (দেখুন  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
@ পিটারক্রস এর oidকলামটি pg_proc। এটি একটি গোপন কলাম।
ক্রেগ রিঞ্জার

1
আরও দেখুন stackoverflow.com/a/25388031/161040 কিভাবে এক্সটেনশন-নির্ভরশীল ফাংশন বাদ দেওয়ার জন্য (PostGIS থেকে যেমন ফাংশন)।
সাইমন ডি

20

একটি ভিউ তৈরি করতে এসকিউএল কোয়েরির নীচে চালান যা সমস্ত ফাংশন দেখায়:

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পোস্টগ্র্রেস ক্লায়েন্ট ইন্টারফেসের একটি আদেশ command এটি কেবলমাত্র কাজ করবে psqlএবং প্রযুক্তিগতভাবে কোনও এসকিউএল কোয়েরি নয়।
গ্রেগট

3

ফাংশন_স্কেমা এবং ফাংশন_নামের তালিকা পান ...


> 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';
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.