Reputation: 109
I am my trying to convert an oracle procedure of something like below to Netezza and facing some issues when executed, no compilation errors. The procedure was executed successfully in Oracle. About the task, it is batch process without expecting to return or take input parameters and loop through the a table to prepare an SQL statement dynamically. Logic is built well as there is no issue in 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;
I get the following error when the procedure is executed "Syntax error, unexpected WORD at or near Varchar2"
Varchar2 is an Oracle datatype and I can confirm it is modified to Varchar of Netezza in my procedure in all the places. I searched on google to find good examples of creating a procedure but unfortunately I could not get desired help.
Also there is particular block code which I want to create as function and re-use it. Unfortunately stuck up with function syntax too.
Appreciate your help
Upvotes: 0
Views: 1628
Reputation: 109
I felt it is time to return back with answer to my own question.
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;
Upvotes: 0
Reputation: 1118
You are on the right track, but I can see at least one mentioning of varchar2(): the last one of your declarations:
lv_ret_string VARCHAR2(1000);
Upvotes: 0