You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 00:06:01