使用存储过程将值插入到 netezza

Posted

技术标签:

【中文标题】使用存储过程将值插入到 netezza【英文标题】:Inserting values in to netezza using a stored procedure 【发布时间】:2014-08-11 14:52:04 【问题描述】:

我正在使用 netezza 数据库,并且需要为加利福尼亚的商店插入 Y 标志。我写了下面的程序

CREATE OR REPLACE PROCEDURE MY_NEW_PROCEDURE() RETURNS BOOL
EXECUTE AS OWNER LANGUAGE NZPLSQL AS
BEGIN_PROC
DECLARE
    rec RECORD;
BEGIN
FOR rec in SELECT * from test_table 
LOOP
if rec.state_code ='CA'
EXECUTE IMMEDIATE 'INSERT INTO test_table (california_stores)' || 'values('y')';
END LOOP;
END;
END_PROC;

当我使用 call MY_NEW_PROCEDURE() 调用该过程时,我在 EXECUTE IMMEDIATE 行出现错误。我不确定我需要在这里做些什么改变。

【问题讨论】:

我只想根据商店位置插入一个标志。如果存储过程不是这样的。我也欢迎其他方式来实现这一点。谢谢。 看起来您需要在“y”周围转义单引号。大概应该是 values(''y'')'; @ShaunPeterson 我逃脱了 Y 并执行了它。我收到以下错误 您没有发布新错误? 【参考方案1】:

不知道 netezza,但下面是我用来测试它的过程(使用 SQL 开发人员)。

对我来说效果很好,尽管更新行以将 california_stores 设置为“Y”而不是为您拥有的每个加州商店插入一个 california_stores = 'Y' 的新行更有意义.....

CREATE OR REPLACE PROCEDURE "MY_NEW_PROCEDURE" as
    rec test_table2%rowtype;
BEGIN
   FOR rec in (SELECT * from test_table2) LOOP
      if rec.state_code = 'CA' then
         EXECUTE IMMEDIATE 'INSERT INTO test_table2 (california_stores)' || 'values(''y'')';
      end if;
   END LOOP;
END;

【讨论】:

【参考方案2】:

您没有发布第二个错误,但在我看来,您的插入语句无论如何都不会做您想做的事。如果rec 变量包含属性state_code 并且您正在向test_table 插入单个值,那么除了california_stores 中的“Y”之外,该记录将为空。

我猜你现在遇到了一个错误,要么是因为插入语句insert into test_table (california_stores)values('y') 中的空格,要么是因为你没有用分号终止执行语句。该行的plsql应该是

execute immediate 'insert into test_table (california_stores) values (''y'');';

【讨论】:

以上是关于使用存储过程将值插入到 netezza的主要内容,如果未能解决你的问题,请参考以下文章

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

使用雪花中的存储过程将值插入表中

如何将 Netezza 存储过程的返回值捕获到变量中?

Netezza 存储过程 DB_NAME 作为参数

如何在 Netezza 的存储过程中使用 CASE 语法

Netezza 存储过程中是不是有任何方法可以将输出放入文件中