Snowflake SQL 存储过程不起作用

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

我正在尝试在 Snowflake (Snowsight) 中创建 SQL 存储过程,但它抛出运行时错误。无法确定问题所在。

我收到错误:

无效标识符“C_KEY_REC.KEY_NM”

有人可以帮忙吗?我是新手,必须使用 SQL 存储过程。没有从 Google 获得任何解决方案。

下面是我所拥有的模型版本:

CREATE OR REPLACE TABLE KEY_TBL
(
     key_nm         VARCHAR
    ,key_val        VARCHAR
    ,active_yn      VARCHAR
);

INSERT INTO KEY_TBL(key_nm, key_val, active_yn )
VALUES
     ('KEY_NAME_1','KEY_VAL_1', 'Y')
    ,('KEY_NAME_2','KEY_VAL_2', 'Y')
;

CREATE OR REPLACE TABLE LOOP_CHK
(
     key_nm         VARCHAR
    ,key_val        VARCHAR
);

CREATE OR REPLACE PROCEDURE SP_LOOP_TEST()
RETURNS VARCHAR
LANGUAGE SQL
AS
DECLARE
    cur_key    CURSOR FOR SELECT key_nm, key_val FROM KEY_TBL WHERE active_yn = 'Y' ORDER BY key_nm;

BEGIN
    OPEN cur_key;
    FOR c_key_rec IN cur_key
    DO
        INSERT INTO LOOP_CHK(key_nm, key_val)
        VALUES(c_key_rec.key_nm, c_key_rec.key_val);
    END FOR;
    RETURN '1';
END;
;

CALL SP_LOOP_TEST();

我尝试了使用和不使用 OPEN 语句的情况。检查了 Snowflake 文档以及此网站和谷歌中的其他网站。但无法解决。

stored-procedures snowflake-cloud-data-platform
1个回答
0
投票

使用游标时需要使用动态SQL(立即执行)

CREATE OR REPLACE PROCEDURE SP_LOOP_TEST()
RETURNS VARCHAR
LANGUAGE SQL
AS
DECLARE
    cur_key cursor for  SELECT key_nm, key_val 
    FROM KEY_TBL WHERE active_yn = 'Y' ORDER BY key_nm;
v_insert_stmt varchar2;
    --cur_main cursor for select sis_table,census_table, sis_column_list, process_flag 
     --       from CENSUS_HISTORY.CENSUS_SIS_MAPPING   WHERE process_flag = 'Y';
BEGIN
   -- OPEN cur_key;
   FOR c_key_rec IN cur_key do

   v_insert_stmt := ' INSERT INTO LOOP_CHK(key_nm, key_val) ' ||
        ' VALUES(' || '\'' || c_key_rec.key_nm || '\'' || ', 
                    ' || '\''||  c_key_rec.key_val || '\'' || ' )';
    execute immediate v_insert_stmt;    
    END FOR;
    RETURN '1';
END;
© www.soinside.com 2019 - 2024. All rights reserved.