Выполнить немедленно в хранимой процедуре 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. Часто на порядок.

Другие вопросы по тегам