2

我可以像这样从目录表中获取函数返回类型......

SELECT proname, pg_get_function_result(p.oid)
FROM pg_proc p 
JOIN pg_namespace n on n.oid = p.pronamespace 
WHERE n.nspname = 'someschema' and p.proname = 'somefunction'

我还想获取返回类型的
a) 长度
b) 精度
c) 比例(如果数据类型支持)

是否可以从列中获取它,pg_catalog或者我必须从information_schema列中获取它?

4

2 回答 2

1

注意力!对于 PostgreSQL 标量函数,精度和比例通常是无用的,因为它被忽略了。只有类型很重要。

postgres=# 创建或替换函数 foo1()
返回数字(10,3)为 $$
开始
  返回 10.0/3.0;
结尾;
$$ 语言 plpgsql;
创建函数
时间:39.511 毫秒
postgres=# 选择 foo1();
        foo1        
────────────────────
 3.3333333333333333
(1 行)

时间:0.910 毫秒
postgres=# 创建或替换函数 foo2()
返回 varchar(2) 作为 $$
开始
  返回'abcde';
结尾;
$$ 语言 plpgsql;
创建函数
时间:28.992 毫秒
postgres=#选择 foo2();
 foo2  
────────
 abcde
(1 行)

时间:0.746 毫秒

只有使用域​​,您才能将(或确保必要的强制转换)传播到函数的外部:

postgres=#CREATE DOMAIN xx AS numeric(10,3);
创建域
postgres=# 创建或替换函数 foo4()
返回 xx 作为 $$
开始
  返回 10.0/3.0;
结尾;
$$ 语言 plpgsql;
创建函数
时间:32.417 毫秒
postgres=# 选择 foo4();
 foo4  
────────
 3.333
(1 行)

获取有关系统目录已用查询的信息的技巧。

  • 使用参数 -E 运行 psql
  • 使用相关的 \d* 命令
bash-4.1$ psql.92 postgres -E
psql.92 (9.2.2)
键入“帮助”以获得帮助。

postgres=#\df
********* 询问 **********
选择 n.nspname 作为“架构”,
  p.proname 作为“名称”,
  pg_catalog.pg_get_function_result(p.oid) 作为“结果数据类型”,
  pg_catalog.pg_get_function_arguments(p.oid) 作为“参数数据类型”,
 案子
  当 p.proisagg THEN 'agg'
  当 p.proiswindow THEN '窗口'
  当 p.prorettype = 'pg_catalog.trigger'::pg_catalog.regtype THEN 'trigger'
  否则“正常”
END 作为“类型”
FROM pg_catalog.pg_proc p
     左连接 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'
按 1、2、4 排序;
******************************

                                        功能列表
 架构│名称│结果数据类型│参数数据类型│类型  
────────┼────────────────────────────┼──────────── ──────────────────┼──────────────────────┼────────
 公共 │ f1 │ 无效 │ │ 正常
 公共 │ foo1 │ 数字 │ │ 普通
 公共 │ foo2 │ 字符变化 │ │ 普通
 public │ foo3 │ numeric │ OUT 结果 numeric │ normal
 公共 │ foo4 │ xx │ │ 普通
 public │ to_timestamp_ignore_errors │ 没有时区的时间戳 │ text │ normal
 public │ xavg │ bigint │ integer │ normal
(7 行)
于 2013-08-13T03:36:12.610 回答
0

看看这篇文章:http ://www.alberton.info/postgresql_meta_info.html#.UglOxtJT63M

我根据那篇文章做了一个简短的回答:

select
    p.proname, pg_get_function_result(p.oid), 
    p.proargnames,
    array(
        select format_type(a.p::int, null)
        from (select regexp_split_to_table(p.proargtypes::text, ' ') as p) as a
    )
from pg_proc as p 
    inner join pg_namespace as n on n.oid = p.pronamespace 
where n.nspname = 'someschema' and p.proname = 'somefunction'
于 2013-08-12T21:21:26.623 回答