在 netezza 存储过程中立即执行不会向表中插入值

Posted

技术标签:

【中文标题】在 netezza 存储过程中立即执行不会向表中插入值【英文标题】:Execute immediate in netezza stored procedure is not inserting value to a table 【发布时间】:2017-01-05 08:17:50 【问题描述】:

当我运行这个 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;

您可以在the documentation here找到更多信息。

注意:我假设您在这个存储过程中有一些更复杂的逻辑要实现,因为逐行循环会比 insert..select 慢得多。通常是一个数量级。

【讨论】:

感谢您的回复。是的,我必须比较 TABLE_A 的两列,并根据结果将数据插入 TABLE_B。 该解决方案对您有用吗?如果有,请将其标记为答案。如果没有,请告诉我们出了什么问题。

以上是关于在 netezza 存储过程中立即执行不会向表中插入值的主要内容,如果未能解决你的问题,请参考以下文章

mysql写存储过程对单表插入测试数据,出问题

sql存储过程从一张表中查询到的值作为另一张表的新的字段

oracle数据库如何利用存储过程向表中添加数据?

mysql存储过程怎样批量插入数据

mysql存储过程实现数据查询与插入

用于向表中添加新行的存储过程,它检查值以验证它们在外部表上的值