我正在尝试将类似下面的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。我在谷歌搜索找到了创建程序的好例子,但不幸的是我得不到所需的帮助。
还有特定的块代码,我想创建它作为函数并重新使用它。不幸的是,他也坚持使用函数语法。
感谢您的帮助
答案 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;