Snowflake存储过程计数异常:应返回1却返回0
问题分析与解决方案
核心问题1:存储过程调用语法错误
sp_test_1中调用sp_test_2并赋值的写法不符合Snowflake SQL存储过程的语法规范,获取另一个存储过程的返回值必须使用CALL ... INTO ...语法,而非直接赋值。
核心问题2:冗余游标处理(优化点)
sp_test_2中用游标处理单行统计结果完全冗余,直接通过SELECT ... INTO即可完成赋值,能减少代码复杂度并避免潜在的游标逻辑问题。
修正后的存储过程代码
修正sp_test_1
CREATE OR REPLACE PROCEDURE db.schema.sp_test_1() RETURNS VARCHAR LANGUAGE SQL AS $$ DECLARE db_name varchar(20) DEFAULT 'DB1'; schema_name varchar(30) DEFAULT 'SCHEMA1'; table_name varchar(50); col_name varchar(60); response integer; BEGIN table_name := 'TABLE1'; col_name := 'COL1'; -- 修正调用语法,用INTO捕获返回值 CALL sp_test_2(:db_name,:schema_name,:table_name,:col_name) INTO :response; RETURN response; END; $$;
修正sp_test_2
CREATE OR REPLACE PROCEDURE db.schema.sp_test_2(db_na VARCHAR, schema_na VARCHAR, table_na VARCHAR, col_na VARCHAR) RETURNS INTEGER LANGUAGE SQL AS $$ DECLARE value INTEGER; BEGIN -- 直接用INTO赋值,无需游标 SELECT COUNT(*) INTO :value FROM "INFORMATION_SCHEMA"."COLUMNS" WHERE "TABLE_CATALOG" = :db_na AND "TABLE_SCHEMA" = :schema_na AND "TABLE_NAME" = :table_na AND "COLUMN_NAME" = :col_na; RETURN value; END; $$;
额外验证点
如果修正后仍返回0,需检查:
- 传入的
db_name、schema_name、table_name、col_name与INFORMATION_SCHEMA.COLUMNS中的值大小写完全匹配(若对象是通过双引号创建的,Snowflake会保留大小写,此时必须严格匹配)。 - 执行存储过程的角色是否拥有
INFORMATION_SCHEMA.COLUMNS的查询权限。
内容的提问来源于stack exchange,提问作者Robertino Bonora
相关产品推荐
相关产品推荐

