4

由于 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 .....

4

1 回答 1

9

一种通用的方法是在 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"

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

于 2013-09-11T13:17:48.300 回答