Netezza 存储过程错误

Posted

技术标签:

【中文标题】Netezza 存储过程错误【英文标题】:Netezza stored procedure error 【发布时间】:2017-06-06 03:23:01 【问题描述】:

我正在尝试将如下所示的 Oracle 程序转换为 Netezza,并且在执行时遇到了一些问题,没有编译错误。该过程已在 Oracle 中成功执行。关于任务,它是批处理,不期望返回或获取输入参数并循环遍历表以动态准备SQL语句。逻辑构建良好,Oracle 没有问题。

CREATE OR REPLACE PROCEDURE proc1 ()
   RETURNS CHARACTER VARYING (ANY) EXECUTE AS OWNER  LANGUAGE NZPLSQL AS 
BEGIN_PROC

DECLARE

lv_sql varchar(4000);
lv1 varchar(4000);
lv2 varchar(4000);
lv3 varchar(4000);
lv4 varchar(4000);
lv5 varchar(4000);
lv_value varchar(1000);
lv_str_cnt integer;
lv_ret_string VARCHAR(1000);

BEGIN
    FOR c1 IN (SELECT * from test)
    LOOP
            IF lv_str_cnt = 0 THEN
              lv_ret_string := '''' || c1.col1 || '''';
            ELSE IF  lv_str_cnt IS NULL THEN
              lv_ret_string := NULL;
            ELSE
                lv_ret_string := '''' || c1.col2 || '''';
            END IF;
            .............
            .............

        lv_sql := lv_sql || lv1 || lv2 || lv3 || lv4;

        EXECUTE IMMEDIATE lv_sql;

     END LOOP;  

END; 
END_PROC;

执行程序时出现以下错误 "语法错误,在 Varchar2 处或附近出现意外 WORD"

Varchar2 是 Oracle 数据类型,我可以确认它在我的程序中的所有地方都被修改为 Netezza 的 Varchar。我在 google 上搜索以找到创建过程的好例子,但不幸的是我无法获得所需的帮助。

还有我想创建为函数并重新使用它的特定块代码。不幸的是,也坚持使用函数语法。

感谢您的帮助

【问题讨论】:

Netezza 中没有 VARCHAR2。使用 NVARCHAR。检查 lv_ret_string 的类型。 @HGF,是的,同意,我在 Lars 指出之后已经对其进行了修改。我也在编辑主题。但我仍然会遇到同样的错误。 @HGF,请问有什么带光标的循环吗? 你应该将 c1 声明为 RECORD。 @HGF,几分钟前就这样做了,并且还做了类似的事情 【参考方案1】:

你在正确的轨道上,但我可以看到至少有一次提到 varchar2():你的最后一个声明:

lv_ret_string VARCHAR2(1000);

【讨论】:

感谢@Lars 指出这一点。我的错我错过了它,但即使将其更改为 Varchar 也是同样的错误。请有任何建议 任何带有循环光标的东西【参考方案2】:

我觉得是时候回来回答我自己的问题了。

CREATE OR REPLACE PROCEDURE proc1 ()
   RETURNS CHARACTER VARYING (ANY) EXECUTE AS OWNER  LANGUAGE NZPLSQL AS 
BEGIN_PROC

DECLARE
c1      RECORD;
v_sql   text;

lv_sql varchar(4000);
lv1 varchar(4000);
lv2 varchar(4000);
lv3 varchar(4000);
lv4 varchar(4000);
lv5 varchar(4000);
lv_value varchar(1000);
lv_str_cnt integer;
lv_ret_string VARCHAR(1000);

BEGIN
    v_sql := 'SELECT * from test;';

    FOR c1 IN EXECUTE v_sql
    LOOP
            IF lv_str_cnt = 0 THEN
              lv_ret_string := '''' || c1.col1 || '''';
            ELSE IF  lv_str_cnt IS NULL THEN
              lv_ret_string := NULL;
            ELSE
                lv_ret_string := '''' || c1.col2 || '''';
            END IF;
            .............
            .............

        lv_sql := lv_sql || lv1 || lv2 || lv3 || lv4;

        EXECUTE IMMEDIATE lv_sql;

     END LOOP;  

END; 
END_PROC;

【讨论】:

以上是关于Netezza 存储过程错误的主要内容,如果未能解决你的问题,请参考以下文章

pypyodbc 从 python 在 netezza 数据库中创建存储过程的错误

存储过程中从一个表到另一个表的 Netezza 更新错误

在 IBM netezza SQL 数据库中运行存储过程的错误

带有 ^ 的 Netezza 存储过程错误发现“”(在字符 76 处)未终止的 BEGIN_PROC 字符串

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

如何访问 Netezza 存储过程中的参数?