Snowflake存储过程中使用INSERT INTO报错问题排查求助
问题描述
在Snowflake中创建了salesforce.unprocessed.job_logs2表,用于记录指定表在对应日期的唯一主键数量,表结构及示例数据如下:
create table salesforce.unprocessed.job_logs2 (namespace varchar(255), rundate datetime, distinct_count NUMBER); insert into salesforce.unprocessed.job_logs2 (namespace, rundate, distinct_count) values ('SALESFORCE.UNPROCESSED.ACCOUNTTEAMMEMBER', '2024-11-01', 12345), ('SALESFORCE.UNPROCESSED.ACCOUNTTEAMMEMBER', '2024-11-02', 12346), ('SALESFORCE.UNPROCESSED.ACCOUNTTEAMMEMBER', '2024-11-03', 12347), ('SALESFORCE.UNPROCESSED.USERROLE', '2024-11-01', 15), ('SALESFORCE.UNPROCESSED.USERROLE', '2024-11-01', 19), ('SALESFORCE.UNPROCESSED.USERROLE', '2024-11-01', 19)
计划实现每日任务,统计salesforce.unprocessed schema下各表的唯一ID总数及去重数,插入到job_logs表中,编写的SQL存储过程如下:
CREATE OR REPLACE PROCEDURE run_daily_job() RETURNS VARCHAR LANGUAGE SQL AS $$ DECLARE namespaces ARRAY; namespace VARCHAR; result VARCHAR; BEGIN SELECT ARRAY_AGG(namespace) INTO :namespaces FROM namespaces_table; FOR namespace IN :namespaces LOOP BEGIN INSERT INTO salesforce.unprocessed.job_logs SELECT :namespace AS namespace, CURRENT_DATE() AS rundate, (SELECT COUNT(DISTINCT id) FROM IDENTIFIER($namespace$)) AS distinct_id_count, (SELECT COUNT(id) FROM IDENTIFIER($namespace$)) AS id_count; result := 'Success'; EXCEPTION WHEN OTHERS THEN result := 'Error processing namespace: ' || :namespace || ' - ' || SQLERRM(); END; END LOOP; RETURN result; END; $$;
执行时出现语法错误,错误信息:
Syntax error: unexpected 'INTO'. (line 10) syntax error line 10 at position 26 unexpected '.'. syntax error line 10 at position 38 unexpected '.'. syntax error line 11 at position 4 unexpected 'SELECT'. (line 10)
注:namespace_list表存储需统计的表名列表,结构及数据如下:
create table salesforce.unprocessed.namespace_list (namespace varchar(1024)); insert into salesforce.unprocessed.namespace_list (namespace) values ('SALESFORCE.UNPROCESSED.PRODUCT2', 'SALESFORCE.UNPROCESSED.ACCOUNTTEAMMEMBER', 'SALESFORCE.UNPROCESSED.USERROLE')
错误原因分析
- 表名拼写错误:存储过程中查询的表是
namespaces_table,但实际存储表名的表是namespace_list,名称不匹配导致Snowflake无法识别该表,触发语法解析错误。 - 数组遍历语法不符合规范:Snowflake SQL存储过程中,遍历数组不能直接使用
FOR namespace IN :namespaces LOOP,正确写法需要通过数组索引遍历:FOR i IN 1 TO ARRAY_SIZE(:namespaces) LOOP,再用namespaces[i]获取元素。原写法违背Snowflake语法规则,导致解析失败。 - 动态标识符引用错误:使用
IDENTIFIER($namespace$)是错误的变量引用方式,Snowflake中动态引用标识符应该用IDENTIFIER(:namespace),错误写法引发语法解析异常。
内容的提问来源于stack exchange,提问作者Brad Davis
相关产品推荐
相关产品推荐

