2009-11-11 5 views
0

Ma procédure:Oracle 10g - ORA-01747 erreur

CREATE OR REPLACE PROCEDURE akcia_nepozicane_s_kurzorom 
    (denny_poplatok IN NUMBER, 
    kilometrovy_poplatok IN NUMBER) 
AS 
    my_id_auto NUMBER(5); 
    my_poplatok_denny NUMBER(4); 
    my_poplatok_km NUMBER(2); 
    CURSOR c1 IS 
     SELECT id_auto, poplatok_denny, poplatok_km FROM Auta; 
BEGIN 
    OPEN c1; 
    LOOP 
     FETCH c1 INTO my_id_auto, my_poplatok_denny, my_poplatok_km; 
     EXIT WHEN c1%NOTFOUND; 
     IF my_poplatok_km >= 10 THEN 
      UPDATE Auta SET 
       poplatok_denny = denny_poplatok, 
       poplatok_km = kilometrovy_poplatok 
      WHERE id_auto = my_id_auto; 
     ELSE 
      UPDATE Auta SET 
       poplatok_denny = denny_poplatok, 
      WHERE id_auto = my_id_auto;   
     END IF; 
     COMMIT; 
    END LOOP; 
    CLOSE c1; 
END; 

Lorsque je tente exécuter ce code dans Oracle 10g Express Edition, je reçois cette erreur si:

ERROR at line 23: PL/SQL: ORA-01747: invalid user.table.column, table.column, or column specification 

1. CREATE OR REPLACE PROCEDURE akcia_nepozicane_s_kurzorom 
2.  (denny_poplatok IN NUMBER, 
3.  kilometrovy_poplatok IN NUMBER) 
4. AS 

Je ne vois pas des mots réservés dans mon code alors pourquoi ai-je cette erreur?

Répondre

4

Vous avez une virgule étrangère à

 UPDATE Auta SET 
      poplatok_denny = denny_poplatok, 
     WHERE id_auto = my_id_auto;   
+0

Erreur stupide :) –

+3

Ça nous arrive à tous! –

5

Probablement une erreur que vous auriez évité si vous avez suivi la règle d'or: Ne jamais utiliser PL/SQL lorsque vous pouvez utiliser SQL

CREATE OR REPLACE PROCEDURE akcia_nepozicane_s_kurzorom 
    (denny_poplatok IN NUMBER, 
    kilometrovy_poplatok IN NUMBER) 
AS 
BEGIN 

    UPDATE Auta 
    Set poplatok_denny = akcia_nepozicane_s_kurzorom.denny_poplatok, 
     poplatok_km = Case When Auta.poplatok_km >= 10 
           then akcia_nepozicane_s_kurzorom.kilometrovy_poplatok 
           Else Auta.poplatok_km 
          End; 
    COMMIT; 
END akcia_nepozicane_s_kurzorom ; 

Non vérifié pour la syntaxe (ou qu'elle correspond exactement à votre logique), mais ceci est plus rapide et moins complexe que la méthodologie du curseur explicite. aussi le commit à l'intérieur du curseur est une très mauvaise pratique.

+2

+1 pour "valider à l'intérieur du curseur est une très mauvaise pratique"; En supposant que vous voulez dire une mauvaise pratique comme dans "provoque le programme d'échouer de manière indéterminée avec ORA-01555 Snapshot Too Old erreurs" –

+4

En partie à cause de ORA-01555, mais aussi en raison de la baisse des performances dues aux synchronisations de fichiers journaux, et ce n'est généralement pas le fin d'une transaction commerciale qui est l'endroit où l'engagement devrait se produire. –