Netezza 存储过程错误
Posted
技术标签:
【中文标题】Netezza 存储过程错误【英文标题】:Netezza stored procedure error 【发布时间】:2017-06-06 03:23:01 【问题描述】:我正在尝试将如下所示的 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 处或附近出现意外 WORD"
Varchar2 是 Oracle 数据类型,我可以确认它在我的程序中的所有地方都被修改为 Netezza 的 Varchar。我在 google 上搜索以找到创建过程的好例子,但不幸的是我无法获得所需的帮助。
还有我想创建为函数并重新使用它的特定块代码。不幸的是,也坚持使用函数语法。
感谢您的帮助
【问题讨论】:
Netezza 中没有 VARCHAR2。使用 NVARCHAR。检查 lv_ret_string 的类型。 @HGF,是的,同意,我在 Lars 指出之后已经对其进行了修改。我也在编辑主题。但我仍然会遇到同样的错误。 @HGF,请问有什么带光标的循环吗? 你应该将 c1 声明为 RECORD。 @HGF,几分钟前就这样做了,并且还做了类似的事情 【参考方案1】:你在正确的轨道上,但我可以看到至少有一次提到 varchar2():你的最后一个声明:
lv_ret_string VARCHAR2(1000);
【讨论】:
感谢@Lars 指出这一点。我的错我错过了它,但即使将其更改为 Varchar 也是同样的错误。请有任何建议 任何带有循环光标的东西【参考方案2】:我觉得是时候回来回答我自己的问题了。
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;
【讨论】:
以上是关于Netezza 存储过程错误的主要内容,如果未能解决你的问题,请参考以下文章
pypyodbc 从 python 在 netezza 数据库中创建存储过程的错误
在 IBM netezza SQL 数据库中运行存储过程的错误