雪花存储过程调用具有迭代返回消息的多个语句

Posted

技术标签:

【中文标题】雪花存储过程调用具有迭代返回消息的多个语句【英文标题】:Snowflake stored procedure calling multiple statements with iterative return messages 【发布时间】:2021-04-07 02:29:46 【问题描述】:

我正在尝试在 Snowflake 中创建一个运行 5 个 COPY INTO 命令的存储过程。我目前只使用 2 个进行测试,以便更好地隔离问题。我希望每个命令都运行并返回“X is good to go!”

这是我目前拥有的。它保存并运行,但它只返回一条消息,并且不运行第二条语句。

create or replace procedure copy_into_tables()
  returns string
  language javascript
  as
  $$


sql_cmd1 =  `copy into "SFDVDH"."SCHEMA"."STG_AUTOMATION_DATA_DAILY"
from (select $1,
  $2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$30,$31,$32,
  current_timestamp(),metadata$filename,iff(split_part(metadata$filename,'_',8)='Partial.txt','Yes','')
from @SFDVDH.SCHEMA.stage)
FILE_FORMAT = (FORMAT_NAME = SFDVDH.SCHEMA.FORMAT_CSV)
pattern ='.*Automation_Data.*';`

var data1_copy= snowflake.createStatement(  sqlText: sql_cmd1  );
var res1= data1_copy.execute();
return 'Data1 good to go!';

sql_cmd2 =  `copy into "SFDVDH"."SCHEMA"."STG_AUTOMATION_DATA_WEEKLY"
from (select $1,
  $2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,
  current_timestamp(),metadata$filename,iff(split_part(metadata$filename,'_',8)='Partial.txt','Yes','')
from @SFDVDH.SCHEMA.stage)
FILE_FORMAT = (FORMAT_NAME = SFDVDH.SCHEMA.FORMAT_CSV)
pattern ='.*Automation_Data2.*';`

var Data2_copy= snowflake.createStatement(  sqlText: sql_cmd2  );
var res2= spotradio_copy.execute();
return 'Data2 good to go!';

$$;

我浏览了这个网站以及许多来源,但找不到一种方法来完成这项工作。这个网站上的答案也没有帮助。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

在大多数编程语言中,一个函数只能返回一次 - 一旦您点击了return x 点,该函数就会返回并停止执行它之后的任何操作。

所以解决上述问题的最简单方法是不要return 'Data1 good to go!'。只需设置一个变量,然后在您准备好 return 'Data2 good to go!' 时将其返回。

一个更复杂的替代方案是使用 Snowflake 流和任务——但我还不清楚你想在什么上下文中执行所有这些。如果您提出一个新问题,提供有关您的目标的更多详细信息,我们可以找到解决方法。但是对于这个问题:在大多数语言中,一个函数不能返回两次,而且 - 当然 - 不是这里。

https://community.snowflake.com/s/article/Using-Streams-and-Tasks-inside-Snowflake

【讨论】:

谢谢费利佩。这是一个存储过程,包装在一个任务中,在流上执行语句。 哦,所以如果它已经包含在一个任务中,那么你可以有多个任务,具体取决于彼此的执行。然后每个任务返回一次,下一个任务在前一个任务返回后立即开始运行。

以上是关于雪花存储过程调用具有迭代返回消息的多个语句的主要内容,如果未能解决你的问题,请参考以下文章

具有多个存储过程的任务

可以从雪花中的函数调用存储过程吗

如何获取雪花中执行存储过程的名称?

雪花存储过程多语句列表参数

在雪花存储过程中捕获成功消息

如何在雪花中调用另一个存储过程中的存储过程