Stored procedures Netezza存储过程错误
我正在尝试将下面类似的oracle过程转换为Netezza,在执行时遇到一些问题,没有编译错误。该过程已在Oracle中成功执行。关于该任务,它是一个批处理过程,不需要返回或获取输入参数,并通过表循环来动态准备SQL语句。逻辑构建良好,因为Oracle中没有任何问题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
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,几分钟前就这样做了,还做了类似的事情