You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle %rowtype在PostgreSQL中的等效实现方案咨询

Oracle %rowtype 在 PostgreSQL 中的等效实现

PostgreSQL 没有像 Oracle 那样直接支持 %rowtype 的语法,但可以通过两种方式实现类似功能,满足你用复合类型作为函数输入参数、做多列条件判断的需求:

1. 直接使用表自带的复合类型

PostgreSQL 会自动为每个表生成一个同名的复合类型,你可以直接用这个类型声明参数。比如你的 public.test 表,对应的复合类型就是 public.test。

举个实际例子:
假设 public.test 表结构如下:

CREATE TABLE public.test (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    age INT
);

创建函数时直接用 public.test 作为参数类型,然后在条件判断中提取参数的列值:

CREATE OR REPLACE FUNCTION public.test_func(pky public.test)
RETURNS SETOF public.test AS $$
BEGIN
    -- 多列条件判断:匹配id和name列
    RETURN QUERY
    SELECT * FROM public.test
    WHERE test.id = pky.id AND test.name = pky.name;
    -- 如果是整行匹配,直接写 WHERE test = pky 即可
END;
$$ LANGUAGE plpgsql;

调用函数时,可以直接传入一行数据:

SELECT * FROM public.test_func(ROW(1, '张三', 25)::public.test);

2. 自定义复合类型(按需选择列)

如果你的参数只需要表中的部分列,没必要用整个表的类型,可以自定义一个仅包含目标列的复合类型:

-- 自定义只包含id和name的复合类型
CREATE TYPE public.test_key AS (
    id INT,
    name VARCHAR(50)
);

然后用这个自定义类型声明函数参数:

CREATE OR REPLACE FUNCTION public.test_func(pky public.test_key)
RETURNS SETOF public.test AS $$
BEGIN
    RETURN QUERY
    SELECT * FROM public.test
    WHERE test.id = (pky).id AND test.name = (pky).name;
    -- 注意:这里访问自定义类型的列需要加括号,避免语法歧义
END;
$$ LANGUAGE plpgsql;

调用时传入对应结构的行数据:

SELECT * FROM public.test_func(ROW(1, '张三')::public.test_key);

注意事项

  • PostgreSQL 不支持 public.test%rowtype 这种写法,直接用表名或自定义复合类型即可。
  • 如果使用复合类型作为参数,调用时需要用 ROW(...)::类型名 的方式构造参数值,或者直接传入查询返回的单行数据。

内容的提问来源于stack exchange,提问作者MAK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:24:17