在 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 存储过程中立即执行不会向表中插入值的主要内容,如果未能解决你的问题,请参考以下文章