在 UDF 或存储过程中使用参数返回表

Posted

技术标签:

【中文标题】在 UDF 或存储过程中使用参数返回表【英文标题】:Use parameter in UDF or Stored Procedure to return table 【发布时间】:2021-10-27 08:26:38 【问题描述】:

我有一个使用 Snowflake API 的案例。我们有一堆物化视图,对于我们的每个客户都有多个。在使用 API 时,我们希望使用函数或存储过程在运行时产生结果,并以客户 ID 作为参数。此参数将用于从正确的视图中获取数据,以避免每个客户端都有功能。但是,我遇到了一些问题:

SQL UD(T)F 不起作用,因为您似乎不能 在 FROM 子句中使用参数。你也不能使用变量或 如果我理解正确,运行多个语句。 JavaScript UD(T)F 不起作用,因为您不允许执行 声明。 存储过程适用于单个值(这是一种用途 case),但不适用于返回表格。它可以返回一个 VARIANT,但是 这将在使用我们的 API 的服务中添加工作 想避免。

您对如何实现我们所追求的结果有什么建议吗?我们可以使用我们所追求的结果创建预先计算的视图,但这会导致大量视图,因为我们还需要 API 中的其他参数来获得动态(过滤)结果。因此,基于函数的方法似乎更加简洁且易于维护。

感谢您的帮助和支持!

【问题讨论】:

能否用SP建一个包含结果的表,以便SP完成后可以访问? 【参考方案1】:

如果每个客户端的视图结构相同,您可以使用 UNION ALL 执行 UDTF,合并所有视图并仅过滤您需要的视图。 在实践中,您将始终根据参数只读取一个视图。

类似的东西:

create function t(Client varchar)
returns table(col1 varchar, col2 varchar)
as
$$
      SELECT col1, col2 
        FROM ViewClient1
       WHERE Client = 'Client1'
       UNION ALL
      SELECT col1, col2 
        FROM ViewClient2
       WHERE Client = 'Client2' 
       UNION ALL 
      SELECT col1, col2 
        FROM ViewClient3
       WHERE Client = 'Client3' 
$$;

【讨论】:

【参考方案2】:

可以使用Snowflake Scripting存储过程。

create or replace procedure test_sp_dynamic(table_name string)
returns table(col varchar, col2 varchar)
language sql
as
$$
declare
    res RESULTSET;
    query VARCHAR DEFAULT 'SELECT Y, Z FROM TABLE(?)';
begin
    res := (execute immediate :query using (TABLE_NAME));
    return table(res);
end;
$$;

测试数据:

CREATE OR REPLACE TABLE view_1(Y VARCHAR, Z VARCHAR) AS SELECT 1, 2;
CREATE OR REPLACE TABLE view_2(Y VARCHAR, Z VARCHAR) AS SELECT 3, 4 ;

CALL test_sp_dynamic('VIEW_1');
-- 1  2

CALL test_sp_dynamic('VIEW_2');
-- 3  4

【讨论】:

以上是关于在 UDF 或存储过程中使用参数返回表的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server用户自定义函数(UDF)

SQL Server StoredProc 与 UDF 内联表

如何在 DB2 LUW 中的存储过程或 UDF 中“选择”?

SQL Server存储过程中使用表值作为输入参数示例

EF 存储过程(上)

使用 JDBC 从存储过程中获取 Oracle 表类型