【问题标题】:Use parameter in UDF or Stored Procedure to return table在 UDF 或存储过程中使用参数返回表
【发布时间】: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完成后可以访问?

标签: stored-procedures snowflake-cloud-data-platform user-defined-functions


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 1970-01-01
      • 2019-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-18
      • 2017-01-07
      • 2016-01-25
      相关资源
      最近更新 更多