2017-01-05 63 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_nullable()的列引用,它会解释你列和内容正确报价,逃避它。

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