【问题标题】:postgresql function return varying table structurepostgresql 函数返回不同的表结构
【发布时间】:2018-08-04 16:30:24
【问题描述】:
对于 Postgresql 函数(存储过程):
我希望存储过程能够根据传递的参数返回不同的表结构。粗略的例子:
创建或替换函数 getMyinfo(emp_id varchar, inc_status)
RETURNS TABLE [不知道怎么设置这个……???]
作为
$$
开始
如果 inc_status = false
然后
从 emp_data 中返回选择 fname、lname、emp_age
其中 id = emp_id;
别的
返回选择 fname、lname、emp_age、rev_code、m_stat
其中 id = emp_id;
万一;
结尾
$$
【问题讨论】:
标签:
postgresql
function
stored-procedures
【解决方案1】:
您可以将函数定义为RETURNS SETOF record,但是您必须在使用该函数的每个查询中指定record 的定义,因为在查询解析时必须知道该定义。
为避免这种情况,您可以使用json 作为返回类型。
【解决方案2】:
替代解决方案:您的两种可能的返回类型非常相似。您可以创建一个包含所有可能列的类型,并返回所有不需要的列都设置为NULL 的类型。这将避免调用函数时过于复杂的查询:
CREATE TYPE result_type AS (
fname TEXT;
lname TEXT;
emp_age INTEGER;
rev_code TEXT;
m_stat INTEGER;
);
CREATE OR REPLACE FUNCTION getMyinfo(emp_id varchar, inc_status)
RETURNS result_type AS
$$
BEGIN
if inc_status = false
then
return select fname, lname, emp_age,
NULL AS rev_code, NULL AS m_stat from emp_data
where id = emp_id;
else
return select fname, lname, emp_age, rev_code, m_stat
where id = emp_id;
end if;
END
$$
【解决方案3】:
我将返回“max”数据结构:在结果集中,“不应该存在”的项目将设置为 null。由于调用代码控制可选参数,它可以决定忽略空列。 json 的想法很有趣,但 API 使用者会期望标准的 DB 结果集。我查看了“重载”API 函数(例如,通过参数计数改变函数接口) - 但 IMO 我认为这是一个糟糕的设计概念:创建多个代码集来维护基本相同的要求。感谢大家的建议。