对于Postgresql函数(存储过程):
我希望存储过程能够根据传递的参数返回不同的表结构。粗略的例子:
CREATE OR REPLACE FUNCTION getMyinfo(emp_id varchar, inc_status) RETURNS TABLE [don't know how to set this...???] AS $$ BEGIN if inc_status = false then return select fname, lname, emp_age 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 $$
答案 0 :(得分:1)
您可以将函数定义为RETURNS SETOF record
,但是您必须在使用该函数的每个查询中指定record
的定义,因为必须在查询分析时知道该定义
为避免这种情况,您可以使用json
作为返回类型。
答案 1 :(得分:1)
替代解决方案:您的两种可能的返回类型非常相似。您可以创建一个包含所有可能列的类型,并返回所有不需要的列设置为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
$$
答案 2 :(得分:0)
我将返回“max”数据结构:在结果集中,“不应该在那里”的项目将设置为null。由于调用代码控制可选参数,因此它可以决定忽略空列。 json的想法很有趣,但API消费者会期望标准的DB结果集。我查看了“重载”API函数(例如,通过参数计数改变函数接口) - 但IMO我认为这是一个糟糕的设计概念:创建多个代码集以维持基本相同的要求。感谢大家的建议。