【问题标题】:Stored procedure handling multiple SQL statements in Snowflake在 Snowflake 中处理多个 SQL 语句的存储过程
【发布时间】:2021-04-20 18:42:55
【问题描述】:

我正在 Snowflake 中创建一个存储过程,最终将被任务调用。

但是我收到以下错误:

不支持单个 API 调用中的多个 SQL 语句;每条语句使用一个 API 调用

并且不确定如何在我的 Javascript 实现中处理建议的解决方案。

这就是我所拥有的

CREATE OR REPLACE PROCEDURE myStoreProcName()
RETURNS VARCHAR
LANGUAGE javascript
AS
$$
var rs = snowflake.execute( { sqlText: 
`set curr_date = '2015-01-01'; 


CREATE OR REPLACE TABLE myTableName AS 


with cte1 as (
SELECT
  * 
FROM Table1
where date = $curr_date
)
,cte2 as (
SELECT
  * 
FROM Table2
where date = $curr_date
)

select * from
cte1 as 1 
inner join cte2 as 2
on(1.key = 2.key)

`
  
   } );
return 'Done.';
$$;

【问题讨论】:

  • 每个 sql 语句都需要一条语句,例如“rs = snowflake.execute...”。您可以在 SP 中拥有任意数量的这些语句
  • 是否会捕获我设置的变量并将其传播到其他查询?
  • 两个 $$ 之间的所有内容都需要是一组有效的 javascript 语句 - 你不能只编写 SQL 语句。我认为您可能需要阅读文档,因为它提供了一些关于如何编写 SP 的好例子
  • 感谢@NickW,我没有在文档中看到多 sql 查询存储 proc 示例。

标签: snowflake-cloud-data-platform


【解决方案1】:

您可以编写自己的辅助函数(用户的想法:waldente):

this.executeMany=(s) => s.split(';').map(sqlText => snowflake.createStatement({sqlText}).execute());

executeMany('set curr_date = '2015-01-01'; 
             CREATE OR REPLACE TABLE ...');

最后一条语句不应包含;,如果在不用作分隔符的 DDL 中存在;,它也可能会失败。

【讨论】:

    【解决方案2】:

    你不能拥有:

    var rs = snowflake.execute( { sqlText: 
    `set curr_date = '2015-01-01'; 
    
    
    CREATE OR REPLACE TABLE myTableName AS 
    ...
    `
    

    相反,您需要拨打execute 两次(或更多次)。每个查询以 ; 结尾。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多