为何在SQL块中执行SHOW WAREHOUSES无返回结果?
问题:Snowflake中BEGIN-END块内SHOW WAREHOUSES管道插入临时表无数据
尝试将SHOW WAREHOUSES的输出抓取到临时表中,在BEGIN-END块外单独执行带管道的语句时,仓库信息能正常写入表中,但将逻辑放在块内执行后,临时表无数据。最终希望将该逻辑用于存储过程,需解决此问题。
用户最初的代码:
CREATE OR REPLACE TEMPORARY TABLE APPSUPPORT.PROBLEMS2(PROBLEM_TEXT STRING NOT NULL); BEGIN SHOW WAREHOUSES -> INSERT INTO APPSUPPORT.PROBLEMS2(PROBLEM_TEXT) SELECT "name" FROM $1 ; END; SELECT PROBLEM_TEXT FROM APPSUPPORT.PROBLEMS2;
解决方案
Snowflake的管道操作符->在事务块(BEGIN-END)或存储过程中不被支持,需改用RESULT_SCAN函数捕获SHOW语句的结果集,具体实现如下:
修正后的BEGIN-END块代码
CREATE OR REPLACE TEMPORARY TABLE APPSUPPORT.PROBLEMS2(PROBLEM_TEXT STRING NOT NULL); BEGIN -- 执行SHOW语句获取仓库列表 SHOW WAREHOUSES; -- 通过RESULT_SCAN捕获上一条语句的结果,插入临时表 INSERT INTO APPSUPPORT.PROBLEMS2(PROBLEM_TEXT) SELECT "name" FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())); END; SELECT PROBLEM_TEXT FROM APPSUPPORT.PROBLEMS2;
适配存储过程的实现
如果要将逻辑封装到存储过程中,代码示例如下:
CREATE OR REPLACE PROCEDURE APPSUPPORT.CAPTURE_WAREHOUSE_NAMES() RETURNS VARCHAR LANGUAGE SQL AS $$ BEGIN -- 创建临时表(也可在存储过程外创建) CREATE OR REPLACE TEMPORARY TABLE APPSUPPORT.PROBLEMS2(PROBLEM_TEXT STRING NOT NULL); -- 执行SHOW语句 SHOW WAREHOUSES; -- 插入捕获到的仓库名称 INSERT INTO APPSUPPORT.PROBLEMS2(PROBLEM_TEXT) SELECT "name" FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())); RETURN '仓库名称已成功捕获到临时表'; END; $$; -- 调用存储过程 CALL APPSUPPORT.CAPTURE_WAREHOUSE_NAMES(); -- 查询结果 SELECT PROBLEM_TEXT FROM APPSUPPORT.PROBLEMS2;
说明
RESULT_SCAN函数是Snowflake中用于获取已执行语句结果集的标准方法,通过LAST_QUERY_ID()可以直接引用上一条执行的SHOW WAREHOUSES语句的结果,完美适配事务块和存储过程的执行环境,替代不支持的管道操作符。
内容的提问来源于stack exchange,提问作者Eric Mamet
相关产品推荐
相关产品推荐

