【问题标题】:How to return diferent table data based on an ID passed to an SQL function如何根据传递给 SQL 函数的 ID 返回不同的表数据
【发布时间】:2020-04-17 20:01:42
【问题描述】:

基于此question 我想知道是否可以根据传递给函数的 ID 返回不同的表数据。 类似(伪代码):

CREATE FUNCTION schemaB.testFunc(p_id INT, select_param INT)
  RETURNS setof  schemaZ.Table_1
AS
$$
CASE
    WHEN select_param = 1 THEN SELECT * FROM schemaZ.Table_1 WHERE id = p_id
    WHEN select_param = 2 THEN SELECT * FROM schemaZ.Table_2 WHERE id = p_id
END;
$$
language sql;

Table_1Table_2 不共享相同的列,这会使上述 RETURNS 子句无效。

【问题讨论】:

    标签: postgresql plpgsql database-schema dynamic-sql sql-function


    【解决方案1】:

    这对于 SQL 函数来说通常是不可能的。即使使用多态返回类型,实际的返回类型也必须在调用时确定。但是 SQL 函数中的所有语句都是在函数执行之前计划好的。因此,对于返回不符合返回类型的数据的 SELECT 语句之一,您总是会收到一条错误消息。

    同样的可以在 PL/pgSQL 函数中使用动态 SQL 完成 - 有一些技巧:

    CREATE OR REPLACE FUNCTION f_demo(_tabletype anyelement, _id int)
      RETURNS SETOF anyelement LANGUAGE plpgsql AS
    $func$
    BEGIN
       RETURN QUERY EXECUTE
          format('SELECT * FROM %s WHERE id = $1', pg_typeof(_tabletype))
       USING  _id;
    END
    $func$;
    

    打电话(重要!):

    SELECT * FROM f_demo(null::schemaZ.Table_1, 1);
    

    “诀窍”是将null 值强制转换为所需的表类型,从而定义返回类型选择要选择的表。 详细解释:

    将此作为概念证明。通常,有更好(更安全、更少混乱、更高性能)的解决方案......

    相关:

    【讨论】:

    • 好的,所以我将为每个表使用单独的函数。 SETOF 部分需要匹配返回的行格式,对吧?在该选择中有许多连接可能会使该部分变得棘手还是“可行”?
    • @Eunito:不能说,没有足够的信息。尝试一下,如果遇到问题,您可能会就遇到的问题提出新问题。
    猜你喜欢
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    相关资源
    最近更新 更多