PostgreSQL:如何显示函数或触发器或查看UNIQUE项的代码?

时间:2017-11-17 00:43:04

标签: postgresql

这个问题是这个问题的一些答案的后续问题:
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以防止在函数具有相同名称时出现重复?

0 个答案:

没有答案