【问题标题】:How to get Postgres function name as well as function specific name from pg_catalog.pg_proc?如何从 pg_catalog.pg_proc 获取 Postgres 函数名称以及函数特定名称?
【发布时间】:2013-09-11 12:24:44
【问题描述】:

由于Postgres支持函数重载,获取函数名和函数名(系统生成不重复)更有意义。

假设我有 2 个名为 Func1 的函数,它们被重载,如下所示,

  CREATE FUNCTION "Schema"."Func1"(IN param1 INTEGER,
  IN Param2 CHAR)
  RETURNS INTEGER
  AS $BODY$

  begin
  return param1+1;
  end  $BODY$
  LANGUAGE PLPGSQL;@


  CREATE FUNCTION "Schema"."Func1"(IN param1 INTEGER)
  RETURNS INTEGER
  AS $BODY$

  begin
  return param1+1;
  end  $BODY$
  LANGUAGE PLPGSQL;@

如何从 pg_catalog.pg_proc 正确加载函数和输入参数。 在 information_schema.routines 的帮助下,有一种方法可以加载函数 1)specific_name 2)routine_name

但是 information_schema.routines 中缺少许多其他属性,例如 1) isWindow 函数 2) isStrict 函数 3) isProRetSet 函数

那么还有其他方法可以从 pg_catalog 中获取函数 specific_name .....

【问题讨论】:

    标签: function postgresql


    【解决方案1】:

    一般的方法是在 psql 中使用psql -E 或设置ECHO_HIDDEN 并查看它为反斜杠命令生成的查询。

    例如,\df "Func1" 使用 PostgreSQL 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 p.proname ~ '^(Func1)$'
      AND pg_catalog.pg_function_is_visible(p.oid)
    ORDER BY 1, 2, 4;
    

    它为您提供有关如何获取与名称 "Func1" 关联的不同函数签名的说明

    \df+ 相同会导致其他属性,例如波动性。

    【讨论】:

    • 谢谢,pg_get_function_arguments(p.oid) 作为 Argument_data_types,给出像“param1 integer, param2 character”这样的数据。所以我必须编写一个解析器来解析并获取单个值,例如第一个参数名称为 param1,其数据类型为整数,等等每个输入参数。还有其他与参数相关的属性,如 parameter_mode(IN,OUT,INOUT,VARIADIC)可以从 information_schema.routines 轻松检索。如果有可能获得特定的函数名(不重复),那么很容易同时获得 .pg_proc 和 .routines 的优势......
    猜你喜欢
    • 2022-11-20
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多