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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 13:10:59