为什么在 Snowflake SQL 中使用 INSERT INTO 调用包含在存储过程中时会生成错误?

问题描述 投票:0回答:1

我有一个雪花表,它显示给定的表和日期,与其关联的唯一主键的数量。这是一些示例数据

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 中的这些表运行查询,以计算唯一 ID 的数量。我创建了以下存储过程来为我执行此插入操作(稍后我将创建一个任务来运行它),但我收到错误

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)

有人可以向我解释一下这里的问题是什么吗?我不明白。在我看来这应该运行。

注意:命名空间表包含一个值列表,例如


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')
snowflake-cloud-data-platform
1个回答
0
投票

首先,要在查询中使用动态表名,您应该使用 EXECUTE IMMEDIATE。 第二件事是使用 Cursor for 循环。 您可能需要这些更改:

  1. 使用立即执行

  2. 使用关键字作为占位符。

  3. 迭代光标。

     FOR rec IN cur DO
     BEGIN
       -- Dynamically execute the query for each table name
       BEGIN
         EXECUTE IMMEDIATE
           'INSERT INTO salesforce.unprocessed.job_logs
            SELECT ?, CURRENT_DATE(), 
                   (SELECT COUNT(DISTINCT id) FROM IDENTIFIER(?) ), 
                   (SELECT COUNT(id) FROM IDENTIFIER(?) )'
           USING rec.namespace, rec.namespace, rec.namespace;
         result := 'Success';
       EXCEPTION
         WHEN OTHERS THEN
           -- Error handling with more descriptive error message
           result := 'Error processing namespace: ' || rec.namespace || ' - ' || SQLERRM();
       END;
     END;
    

    结束循环;

© www.soinside.com 2019 - 2024. All rights reserved.