2017-06-06 5 views
0

Ich bin mein versuchen, eine Orakel-Prozedur von etwas wie unten zu Netezza zu konvertieren und einige Probleme konfrontiert, wenn ausgeführt, keine Kompilierungsfehler. Die Prozedur wurde erfolgreich in Oracle ausgeführt. Bei der Aufgabe handelt es sich um einen Stapelverarbeitungsprozess, ohne dass erwartet wird, Eingabeparameter zurückzugeben oder zu übernehmen und die Tabelle zu durchlaufen, um eine SQL-Anweisung dynamisch vorzubereiten. Logic ist gut gebaut, da es in Oracle kein Problem gibt.Netezza gespeicherte Prozedur Fehler

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; 

bekomme ich folgende Fehlermeldung, wenn die Prozedur „Syntaxfehler, unerwarteter WORD an oder nahe Varchar2“ ausgeführt

Varchar2 ist ein Oracle-Datentyp und ich kann bestätigen, es Varchar von Netezza modifiziert wird, in mein Verfahren in allen Orten. Ich suchte auf Google nach guten Beispielen für die Erstellung einer Prozedur, aber leider konnte ich nicht die gewünschte Hilfe bekommen.

Auch gibt es bestimmte Block-Code, den ich als Funktion erstellen und wiederverwenden möchte. Leider auch mit der Funktionssyntax.

Schätzen Sie Ihre Hilfe

+0

In Netezza ist kein VARCHAR2 vorhanden. Verwenden Sie NVARCHAR. Überprüfen Sie den Typ für lv_ret_string. – HGF

+0

@HGF, Ja zugestimmt, ich habe es schon geändert nachdem Lars darauf hingewiesen hat. Ich bearbeite das Thema auch. Aber trotzdem habe ich denselben Fehler. – Venkat

+0

@HGF, alles mit dem Cursor für die Schleife bitte? – Venkat

Antwort

0

Ich fühlte es Zeit ist, mit Antwort auf meine eigene Frage zurückkommen.

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; 
0

Sie auf dem richtigen Weg sind, aber ich kann zumindest eine Erwähnung von varchar2() sehen: die letzten Ihren Erklärungen:

lv_ret_string VARCHAR2(1000); 
+0

Danke @Lars für das Hinzeigen. Mein schlechtes Ich habe es verpasst, aber es ist der gleiche Fehler, selbst nachdem ich es auf Varchar geändert habe. Irgendwelche Vorschläge bitte – Venkat

+0

alles mit Cursor für Schleife bitte – Venkat

Verwandte Themen