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
相关产品推荐
相关产品推荐

