Snowflake存储过程中调用其他存储过程并捕获返回值的方法
Snowflake SQL存储过程跨过程调用及返回值捕获实现
你当前代码无法正常运行的核心原因是:getRowCount存储过程定义的返回类型为TABLE(a integer)结果集,无法直接将结果集整体赋值给整数类型的标量变量v_sis_count,可通过以下两种方案实现需求:
方案1:调整被调存储过程返回整数标量(推荐)
该方案改动量最小、后续调用最简便,直接修改getRowCount的返回类型,执行计数查询后直接返回整数值即可,无需额外处理结果集解析逻辑:
create or replace procedure getRowCount(schema_name varchar, table_name varchar) returns integer language sql as $$ declare v_count integer; -- 使用IDENTIFIER函数解析对象名,兼容特殊字符命名,规避SQL注入风险 query varchar default 'SELECT count(*) FROM ' || identifier(:schema_name) || '.' || identifier(:table_name); begin execute immediate :query into v_count; return v_count; end; $$;
修改完成后,你原有调用逻辑v_sis_count := getRowCount('SCHEMA_1','TABLE_1');可直接生效,不需要做额外调整。
方案2:保留被调过程返回表类型,调用方解析结果集
如果因其他业务依赖必须保留getRowCount返回表结果的逻辑,需要在调用方存储过程中先接收存储过程返回的结果集,再通过游标提取第一行的计数值。
首先在PROC_TABLE_COUNT的声明区新增两个变量:
-- 新增在declare块内 v_res RESULTSET; cur CURSOR FOR v_res;
再将原有直接赋值的调用逻辑替换为结果集解析逻辑:
v_src_schema := 'SCHEMA_1'; -- 调用返回表类型的存储过程,将结果赋值给结果集变量 v_res := (call getRowCount('SCHEMA_1','TABLE_1')); -- 打开游标提取第一行的计数值 open cur; fetch cur into v_sis_count; close cur; -- 后续可直接使用v_sis_count的值插入统计结果表
注意事项
- 若需要在FOR循环中批量统计多个表的行数,直接把上述调用逻辑放到循环体内,每次传入不同的schema、表名参数即可。
- 所有动态拼接SQL中涉及schema、表、列等对象名的位置,建议统一使用
IDENTIFIER()函数包裹,不要直接做字符串拼接,避免特殊字符命名报错、降低SQL注入风险。
内容的提问来源于stack exchange,提问作者Himanshu Kandpal
相关产品推荐
相关产品推荐

