这个问题是这个问题的一些答案的后续问题:
的 How to display the function, procedure, triggers source code in postgresql?
(另见:https://stackoverflow.com/a/20549944/538962)
虽然这个问题的答案“有效”,但我遇到了一个问题。
如果我查询函数列表,并在该查询中包含一个子查询以返回每个函数的代码,当一个模式包含两个或多个具有相同名称的函数时,查询就会中断(和不同的功能签名)。例如,some_function(arg1 integer)
vs some_function(arg1 char)
:函数具有相同的名称但不同的参数。
以下是查询:
SELECT
n.nspname AS schema
, p.proname AS function_or_trigger_name
-- THIS SUB-QUERY RETURNS MULTIPLE RECORDS IF
-- SEPARATE FUNCTIONS HAVE THE SAME NAME AND DIFFERENT SIGNATURES
, (
SELECT
r.routine_definition
FROM
information_schema.routines AS r
WHERE
r.specific_schema LIKE n.nspname
AND r.routine_name LIKE p.proname
AND r.routine_schema <> 'information_schema'
AND r.specific_schema <> 'pg_catalog'
) AS code_content
, 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 func_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)
n.nspname <> 'pg_catalog'
AND n.nspname <> 'information_schema'
ORDER BY
schema DESC
, func_type
, function_or_trigger_name;
所以问题是:有没有办法在子查询中创建JOIN
以防止在函数具有相同名称时出现重复?