如何调用Snowflake存储过程 及存储过程内部调用其他存储过程的方法
Snowflake存储过程内部调用其他存储过程的实现方法
Snowflake存储过程支持在内部直接调用其他存储过程,根据你使用的存储过程语言不同,实现方式略有区别:
1. SQL语言存储过程调用
SQL存储过程中直接使用CALL语句即可完成调用,如果需要接收被调用存储过程的返回值,搭配INTO关键字赋值给变量即可。
示例代码如下:
-- 1. 先创建被调用的子存储过程 CREATE OR REPLACE PROCEDURE sub_procedure(input_val STRING) RETURNS STRING LANGUAGE SQL AS BEGIN RETURN 'Received input: ' || input_val; END; -- 2. 创建父存储过程,内部调用子存储过程 CREATE OR REPLACE PROCEDURE parent_procedure() RETURNS STRING LANGUAGE SQL AS DECLARE sub_return_val STRING; BEGIN -- 调用子存储过程,接收返回值 CALL sub_procedure('demo_input') INTO :sub_return_val; -- 后续自定义逻辑 RETURN 'Call result: ' || sub_return_val; END;
2. JavaScript语言存储过程调用
JS存储过程需要通过snowflake.createStatement构造CALL语句执行,参数可以通过绑定变量传入,执行后从结果集中读取返回值。
示例代码如下:
CREATE OR REPLACE PROCEDURE js_parent_procedure() RETURNS STRING LANGUAGE JAVASCRIPT AS $$ // 构造调用子存储过程的SQL语句,使用绑定变量传参 const call_sql = `CALL sub_procedure(?)`; const call_stmt = snowflake.createStatement({ sqlText: call_sql, binds: ['js_demo_input'] }); // 执行调用,获取返回结果 const result_set = call_stmt.execute(); result_set.next(); const sub_result = result_set.getColumnValue(1); return 'JS call result: ' + sub_result; $$;
注意事项
- 调用时传入的参数数量、参数类型必须和被调用存储过程的定义完全匹配,否则会触发参数校验错误
- 调用跨数据库、跨Schema的存储过程时,需要使用全限定名
数据库名.Schema名.存储过程名,或者提前通过USE DATABASE、USE SCHEMA语句切换到对应命名空间 CALL语句默认是同步执行的,父存储过程会等待被调用的子存储过程执行完成后再运行后续逻辑- 如果子存储过程执行中抛出错误,默认会直接终止父存储过程的运行,错误会向上透传,如果需要自定义错误处理,可以搭配
TRY...CATCH语句捕获异常
内容的提问来源于stack exchange,提问作者Sidh
相关产品推荐
相关产品推荐

