2017-01-05 5 views
0

Когда я бегу этот 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'');'; 

ответ

0

При создании строки, которую вы собираетесь запустить 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; 

Вы можете найти более подробную информацию в the documentation here.

Примечание: Я предполагаю, что у вас есть более сложная логика для реализации в этой хранимой процедуре, потому что цикл по строке за строкой будет намного медленнее, чем insert..select. Часто на порядок.

+0

благодарит за ответ. да, мне нужно сравнить два столбца TABLE_A и на основе результата я должен вставить данные в TABLE_B. – VivekT

+0

Это решение работает для вас? Если да, отметьте это как ответ. Если нет, сообщите нам, что пошло не так. – ScottMcG