Snowflake存储过程嵌套查询报错求助:复刻HANA函数逻辑遇阻
在Snowflake中实现HANA式的查询结果复用逻辑
当然可以在Snowflake中实现这种“先执行一个查询得到结果,再基于该结果执行后续查询”的逻辑。你当前的问题出在直接对RESULTSET变量使用TABLE()函数进行嵌套查询——Snowflake的RESULTSET类型本质是未物化的查询结果游标,无法直接作为表源在另一个SELECT语句中被二次查询。
修正后的存储过程示例
方式一:用临时表存储中间结果
DECLARE res1 RESULTSET; BEGIN -- 执行第一个查询并将结果存入临时表 res1 := (SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = :SCHEMA); CREATE OR REPLACE TEMPORARY TABLE temp_last_doc AS SELECT * FROM TABLE(res1); -- 基于临时表执行第二个查询并返回结果 RETURN TABLE(SELECT * FROM temp_last_doc WHERE table_name LIKE 'A%'); END;
方式二:直接生成临时表(省略RESULTSET变量)
如果不需要单独保留RESULTSET变量,也可以直接把第一个查询的结果写入临时表:
BEGIN -- 直接将第一个查询结果存入临时表 CREATE OR REPLACE TEMPORARY TABLE temp_last_doc AS SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = :SCHEMA; -- 基于临时表执行后续查询并返回 RETURN TABLE(SELECT * FROM temp_last_doc WHERE table_name LIKE 'A%'); END;
适配你HANA原逻辑的完整示例
对应你HANA里LAST_DOC关联其他表得到OBQTY的逻辑,用Snowflake的写法如下:
BEGIN -- 模拟HANA中的LAST_DOC多表查询,结果存入临时表 CREATE OR REPLACE TEMPORARY TABLE temp_last_doc AS SELECT ld_col1, ld_col2, ld_col3 -- 替换为你的实际查询字段 FROM table1 JOIN table2 ON table1.id = table2.table1_id JOIN table3 ON table2.id = table3.table2_id -- 添加你的WHERE过滤条件等; -- 模拟HANA中的OBQTY查询,基于临时表关联其他表 RETURN TABLE( SELECT temp_ld.*, ot.col_a, ot.col_b FROM temp_last_doc temp_ld JOIN other_tables ot ON temp_ld.key_column = ot.key_column -- 添加你的过滤、排序等逻辑 ); END;
在Snowflake中,临时表(TEMPORARY TABLE)仅在当前会话有效,不会占用永久存储资源,是实现中间结果复用的最优选择。
内容的提问来源于stack exchange,提问作者Abhi
相关产品推荐
相关产品推荐

