Я пытаюсь создать хранимую процедуру SQL в Snowflake (Snowsight), но выдает ошибку во время выполнения. Не могу определить в чем проблема.
Я получаю эту ошибку:
неверный идентификатор «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, а также этот и другие сайты в Google. Но не смог решить.





вам нужно использовать динамический 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;
@JayantaPaul Никакой динамики не будет, только если вы используете данные, которые получаете от курсора.
Спасибо @Himanshu. Должен ли я использовать динамический подход к запросам для операторов SELECT вместо INSERT?