postgresql函数返回不同的表结构

时间:2018-02-24 21:28:36

标签: postgresql function stored-procedures

对于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
$$

3 个答案:

答案 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我认为这是一个糟糕的设计概念:创建多个代码集以维持基本相同的要求。感谢大家的建议。