代码之家  ›  专栏  ›  技术社区  ›  Jayanta Paul

Snowflake SQL存储过程不工作

  •  0
  • Jayanta Paul  · 技术社区  · 1 年前

    我正试图在Snowflake(Snowsight)中创建一个SQL存储过程,但它引发了运行时错误。无法确定问题所在。

    我得到了这个错误:

    标识符“C_KEY_REC.KEY_NM”无效

    有人能帮忙吗?我是这方面的新手,必须使用SQL存储过程。没有从谷歌周围得到任何决议。

    以下是我所拥有的一个模拟版本:

    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文档,也检查了这个网站和谷歌中的其他网站。但无法解决。

    1 回复  |  直到 1 年前
        1
  •  0
  •   Himanshu Kandpal    1 年前

    使用游标时需要使用动态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;