Выполнить немедленно в хранимой процедуре netezza не вставляя значение в таблицу
Когда я запускаю эту хранимую процедуру Netezza, я получаю сообщение об ошибке
атрибут 'SOME_VALUE' не найден
Согласно требованию я должен получить значение из одной таблицы (TABLE_A
) и вставить в другую таблицу (TABLE_B
).
Это процедура:
create or replace procedure my_proc()
returns boolean
execute as owner
language NZPLSQL
as
BEGIN_PROC
declare rec RECORD ;
BEGIN
for rec in SELECT * from TABLE_A loop
EXECUTE IMMEDIATE
'INSERT INTO TABLE_B(COLUMN_B)
values( '|| rec.COLUMN_A_OFTABLE_A || ')';
END LOOP;
END;
END_PROC;
execute my_proc()
Здесь ниже я могу вставить строку. Но мне нужно вставить другое значение в зависимости от другой таблицы, как я уже упоминал выше.
EXECUTE IMMEDIATE 'INSERT INTO TABLE_B(COLUMN_B) values( ''Y'');';
1 ответ
При построении строки, для которой вы собираетесь выполнить команду EXECUTE IMMEDIATE, вы должны быть осторожны, чтобы все цитировалось правильно. В вашем случае он думает, что ему нужно обработать SOME_VALUE как атрибут / столбец, и он не может использовать столбец с таким именем.
Оберните ссылку на ваш столбец в quote_literal(), и он будет интерпретировать содержимое вашего столбца и будет корректно заключать его в кавычки.
create or replace procedure my_proc()
returns boolean
execute as owner
language NZPLSQL
as
BEGIN_PROC
declare rec RECORD ;
BEGIN
for rec in SELECT * from TABLE_A loop
EXECUTE IMMEDIATE
'INSERT INTO TABLE_B(COLUMN_B)
values( '|| quote_literal(rec.COLUMN_A_OFTABLE_A) || ')';
END LOOP;
END;
END_PROC;
Вы можете найти более подробную информацию в документации здесь.
Примечание: я предполагаю, что у вас есть более сложная логика для реализации в этой хранимой процедуре, потому что цикл по строке за строкой будет намного, намного медленнее, чем insert..select. Часто на порядок.