在netezza存储过程中执行immediate不会将值插入表

时间:2017-01-05 08:17:51

标签: sql-insert netezza execute-immediate

当我运行这个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 个答案:

答案 0 :(得分: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慢得多。通常是一个数量级。