【问题标题】: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 我认为这是一个糟糕的设计概念:创建多个代码集来维护基本相同的要求。感谢大家的建议。

        【讨论】:

          猜你喜欢
          • 2017-09-10
          • 1970-01-01
          • 2019-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-21
          相关资源
          最近更新 更多