Netezza 存储过程错误

Netezza stored procedure error

我正在尝试将类似下面的 oracle 过程转换为 Netezza,但在执行时遇到一些问题,没有编译错误。该过程在 Oracle 中成功执行。关于该任务,它是批处理,不需要 return 或获取输入参数并循环遍历 table 以动态准备 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;

执行程序时出现以下错误 "Syntax error, unexpected WORD at or near Varchar2"

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

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

感谢您的帮助

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

lv_ret_string VARCHAR2(1000);

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

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;