postgesql 数据库如何获取存储过程列列表信息还有参数定义

本文介绍了一种在PostgreSQL数据库中查询所有非聚合函数的方法,包括使用标准SQL和PostgreSQL特定的查询方式,并提供了一个实用的函数`public.function_args`,用于获取指定模式下函数的参数详情。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

要写这个。。恩。确实有用的。
下面是参考资料:
postgresql_meta_info
文章中提到:

SELECT proname
  FROM pg_proc pr,
       pg_type tp
 WHERE tp.oid = pr.prorettype
   AND pr.proisagg = FALSE
   AND tp.typname <> 'trigger'
   AND pr.pronamespace IN (
       SELECT oid
         FROM pg_namespace
        WHERE nspname NOT LIKE 'pg_%'
          AND nspname != 'information_schema'
);
 
-- with INFORMATION_SCHEMA:
 
SELECT routine_name
  FROM information_schema.routines
 WHERE specific_schema NOT IN
       ('pg_catalog', 'information_schema')
   AND type_udt_name != 'trigger';
CREATE OR REPLACE FUNCTION public.function_args(
  IN funcname character varying,
  IN schema character varying,
  OUT pos integer,
  OUT direction character,
  OUT argname character varying,
  OUT datatype character varying)
RETURNS SETOF RECORD AS $$DECLARE
  rettype character varying;
  argtypes oidvector;
  allargtypes oid[];
  argmodes "char"[];
  argnames text[];
  mini integer;
  maxi integer;
BEGIN
  /* get object ID of function */
  SELECT INTO rettype, argtypes, allargtypes, argmodes, argnames
         CASE
         WHEN pg_proc.proretset
         THEN 'setof ' || pg_catalog.format_type(pg_proc.prorettype, NULL)
         ELSE pg_catalog.format_type(pg_proc.prorettype, NULL) END,
         pg_proc.proargtypes,
         pg_proc.proallargtypes,
         pg_proc.proargmodes,
         pg_proc.proargnames
    FROM pg_catalog.pg_proc
         JOIN pg_catalog.pg_namespace
         ON (pg_proc.pronamespace = pg_namespace.oid)
   WHERE pg_proc.prorettype <> 'pg_catalog.cstring'::pg_catalog.regtype
     AND (pg_proc.proargtypes[0] IS NULL
      OR pg_proc.proargtypes[0] <> 'pg_catalog.cstring'::pg_catalog.regtype)
     AND NOT pg_proc.proisagg
     AND pg_proc.proname = funcname
     AND pg_namespace.nspname = schema
     AND pg_catalog.pg_function_is_visible(pg_proc.oid);
 
  /* bail out if not found */
  IF NOT FOUND THEN
    RETURN;
  END IF;
 
  /* return a row for the return value */
  pos = 0;
  direction = 'o'::char;
  argname = 'RETURN VALUE';
  datatype = rettype;
  RETURN NEXT;
 
  /* unfortunately allargtypes is NULL if there are no OUT parameters */
  IF allargtypes IS NULL THEN
    mini = array_lower(argtypes, 1); maxi = array_upper(argtypes, 1);
  ELSE
    mini = array_lower(allargtypes, 1); maxi = array_upper(allargtypes, 1);
  END IF;
  IF maxi < mini THEN RETURN; END IF;
 
  /* loop all the arguments */
  FOR i IN mini .. maxi LOOP
    pos = i - mini + 1;
    IF argnames IS NULL THEN
      argname = NULL;
    ELSE
      argname = argnames[pos];
    END IF;
    IF allargtypes IS NULL THEN
      direction = 'i'::char;
      datatype = pg_catalog.format_type(argtypes[i], NULL);
    ELSE
      direction = argmodes[i];
      datatype = pg_catalog.format_type(allargtypes[i], NULL);
    END IF;
    RETURN NEXT;
  END LOOP;
 
  RETURN;
END;$$ LANGUAGE plpgsql STABLE STRICT SECURITY INVOKER;
COMMENT ON FUNCTION public.function_args(character varying, character
varying)
IS $$For a function name and schema, this procedure selects for each
argument the following data:
- position in the argument list (0 for the return value)
- direction 'i', 'o', or 'b'
- name (NULL if not defined)
- data type$$;
### PostgreSQL 数据类型概述 PostgreSQL 提供了广泛的数据类型来满足不同的应用需求。以下是主要数据类型的分类及其用法: #### 数值类型 数值类型用于表示不同精度的数字。 - **整数类型** - `smallint`:2字节有符号整数,取值范围为 \(-32768\) 到 \(32767\)[^1]。 - `integer (int)`:4字节有符号整数,取值范围为 \(-2147483648\) 到 \(2147483647\)。 - `bigint`:8字节有符号整数,取值范围为 \(-9223372036854775808\) 到 \(9223372036854775807\)。 - **浮点类型** - `real`:4字节浮点数。 - `double precision`:8字节浮点数。 - **任意精度类型** - `numeric(precision, scale)` 或者 `decimal(precision, scale)`:可变精度十进制数,其中 `precision` 是总位数,而 `scale` 表示小数部分的位数。 #### 字符串类型 字符串类型用来保存字符序。 - **定长字符串** - `char(n)`:固定长度的字符串,如果输入短于指定长度,则会自动填充空格至满长;超过则会被截断。 - **不定长字符串** - `varchar(n)`:最大长度不超过 n 的变动长度字符串。 - `text`:无限制的最大长度字符串。 #### 时间日期类型 时间日期类型处理时间和日历信息。 - `date`:只包含年月日的信息。 - `time [without time zone]` / `timetz [with time zone]`:仅含小时分钟秒的时间戳,后者还包括时区偏移量。 - `timestamp [without time zone]` / `timestamptz [with time zone]`:完整的日期加时间记录,同样区分是否带有时区信息。 #### 布尔型 布尔逻辑值只有两个可能的状态——真 (`true`) 和假 (`false`)。 #### 几何类型 几何类型适用于二维平面内的图形对象描述,如点、线段、盒子等。 #### 网络地址类型 网络地址类型专门针对互联网协议中的 IP 地址和其他相关属性设计。 - `inet`:IPv4/IPv6 主机地址或子网。 - `cidr`:CIDR 记录形式的 IPv4/IPv6 子网。 - `macaddr`:MAC 地址。 #### JSON 类型 JSON 类型允许直接存储 JavaScript 对象标记格式的数据结构。 - `json`:未解析的原始 JSON 文本。 - `jsonb`:二进制编码版本的 JSON,提供更好的性能和功能扩展性。 #### 特殊类型 还有一些特殊的内置类型值得注意: - XML 数据类型:支持标准 XML 解析和查询语法[^2]。 - UUID 数据类型:全局唯一标识符,通常由硬件特征加上随机成分构成[^2]。 - 复合类型:类似于 C 结构体的概念,可以组合多个字段形成复杂的数据单元。 - 范围类型:定义了一组有序元素之间的连续区间。 - 伪类型:像 any、anyarray、cstring 等特殊用途的占位符类型。 为了确保操作的安全性和效率,在编写 SQL 查询语句时应当注意保持所涉及变量与表内相应之间的一致性,并适当运用类型转换函数如 `CAST()` 来调整表达式的返回结果。 ```sql SELECT CAST('123' AS integer); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值