Netezza存储过程错误

时间:2017-06-06 03:23:01

标签: stored-procedures netezza

我正在尝试将类似下面的oracle过程转换为Netezza并在执行时遇到一些问题,没有编译错误。该过程在Oracle中成功执行。关于任务,它是批处理过程而不期望返回或获取输入参数并循环遍历a表以动态地准备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。我在谷歌搜索找到了创建程序的好例子,但不幸的是我得不到所需的帮助。

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

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

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

lv_ret_string VARCHAR2(1000);

答案 1 :(得分:0)

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

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;