2017-06-06 1 views
0

Je suis mon essayant de convertir une procédure oracle de quelque chose comme ci-dessous à Netezza et face à certains problèmes lors de l'exécution, pas d'erreurs de compilation. La procédure a été exécutée avec succès dans Oracle. A propos de la tâche, il s'agit d'un traitement par lots sans attente de retour ou de prise de paramètres d'entrée et d'une boucle dans la table pour préparer une instruction SQL de façon dynamique. La logique est bien construite car il n'y a pas de problème dans Oracle.erreur de procédure stockée Netezza

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; 

je reçois l'erreur suivante lorsque la procédure est exécutée « Erreur de syntaxe, WORD inattendue à ou près Varchar2 »

Varchar2 est un type de données Oracle et je peux le confirmer est modifié pour Varchar de Netezza en ma procédure dans tous les endroits. J'ai cherché sur google pour trouver de bons exemples de création d'une procédure mais malheureusement je n'ai pas pu obtenir l'aide désirée.

Il existe également un code de bloc particulier que je veux créer en tant que fonction et le réutiliser. Malheureusement coincé avec la syntaxe de la fonction aussi.

Appréciez votre aide

+0

Il n'y a pas de VARCHAR2 dans Netezza. Utilisez NVARCHAR. Vérifiez le type pour lv_ret_string. – HGF

+0

@HGF, Oui d'accord, je l'ai modifié déjà après pointé par Lars. Je suis en train d'éditer le sujet aussi. Mais encore je me retrouve avec la même erreur. – Venkat

+0

@HGF, quoi que ce soit avec le curseur pour la boucle s'il vous plaît? – Venkat

Répondre

0

je me suis senti qu'il est temps revenir avec réponse à ma propre 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; 
0

Vous êtes sur la bonne voie, mais je peux voir au moins une mention de varchar2(): le dernier de vos déclarations:

lv_ret_string VARCHAR2(1000); 
+0

Merci @Lars pour le signaler. Mon mauvais je l'ai manqué, mais c'est la même erreur même après le changement à Varchar. Toute suggestion s'il vous plaît – Venkat

+0

quoi que ce soit avec le curseur pour la boucle s'il vous plaît – Venkat