Stored procedures Netezza存储过程错误

Stored procedures Netezza存储过程错误,stored-procedures,netezza,Stored Procedures,Netezza,我正在尝试将下面类似的oracle过程转换为Netezza,在执行时遇到一些问题,没有编译错误。该过程已在Oracle中成功执行。关于该任务,它是一个批处理过程,不需要返回或获取输入参数,并通过表循环来动态准备SQL语句。逻辑构建良好,因为Oracle中没有任何问题 CREATE OR REPLACE PROCEDURE proc1 () RETURNS CHARACTER VARYING (ANY) EXECUTE AS OWNER LANGUAGE NZPLSQL AS BEGIN

我正在尝试将下面类似的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处或附近出现意外单词

Varchar2是一种Oracle数据类型,我可以确认它在我的过程中在所有地方都被修改为Netezza的Varchar。我在谷歌上搜索,寻找创建程序的好例子,但不幸的是,我没有得到想要的帮助

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


感谢您的帮助

您走上了正确的道路,但我至少可以看到一次提到varchar2():最后一次声明:

lv_ret_string VARCHAR2(1000);

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

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;

谢谢@Lars指出这一点。我的坏消息是我错过了它,但即使在将它更改为Varchar之后也是相同的错误。任何关于循环的建议都请使用游标。Netezza中没有VARCHAR2。使用NVARCHAR。检查lv_ret_字符串的类型。@HGF,是的,同意,我已经在Lars指出后修改了它。我也在编辑这个话题。但我还是以同样的错误告终。@HGF,有任何关于循环的游标吗?您应该声明c1为记录。@HGF,几分钟前就这样做了,还做了类似的事情