Snowflake中如何调用嵌套建表存储过程并修复现有代码问题
问题根因
- 第一个存储过程
create_table_1()中,return 'Table 1 created';语句放在了调用create_table_2()的代码之前,JavaScript执行到return就会直接终止函数运行,后续调用第二个存储过程的代码永远不会被执行。 - 第二个存储过程
create_table_2()存在变量名引用错误:你定义的语句对象变量名是create_table_2_cmd,但执行时错写为sql_create_table_2,单独调用这个存储过程也会报错。
修正后的存储过程2代码
CREATE OR REPLACE PROCEDURE create_table_2() returns string not null language javascript as $$ var create_table_2 = ` create or replace table DATABASE.SCHEMA.TABLE_2 ( COL_1 string, COL_2 string, COL_3 date ) ; ` // 修正变量名引用错误 var create_table_2_cmd = snowflake.createStatement({sqlText: create_table_2}); var result = create_table_2_cmd.execute(); return 'Table 2 created'; $$;
修正后的存储过程1代码
CREATE OR REPLACE PROCEDURE create_table_1() returns string not null language javascript as $$ var create_table_1 = ` create or replace table DATABASE.SCHEMA.TABLE_1 ( COL_1 string, COL_2 string, COL_3 date ) ; ` var create_table_1_cmd = snowflake.createStatement({sqlText: create_table_1 }); var result = create_table_1_cmd.execute(); // 把调用第二个存储过程的逻辑放到return之前 var call_next_function_cmd = `call create_table_2();` var call_next_func = snowflake.createStatement({sqlText: call_next_function_cmd}); var final = call_next_func.execute(); // 所有逻辑执行完再返回结果 return 'Table 1 created, and create_table_2() triggered successfully'; $$;
额外注意事项
- 如果两个存储过程不在同一个数据库/模式下,调用
create_table_2()时需要补全完整的命名空间,格式为call 数据库名.模式名.create_table_2(); - 执行存储过程的账号需要同时拥有两个存储过程的执行权限,以及对应模式下的建表权限。
内容的提问来源于stack exchange,提问作者RAH
相关产品推荐
相关产品推荐

