我正在尝试在 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 文档以及此网站和谷歌中的其他网站。但无法解决。
使用游标时需要使用动态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;