Pergunta

Meu procedimento:

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;

Quando tento executar esse código no Oracle 10G Express Edition, recebo este erro:

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

Não vejo palavras reservadas no meu código, por que estou recebendo esse erro?

Foi útil?

Solução

Você tem uma vírgula estranha em

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

Outras dicas

Provavelmente um erro que você teria evitado se seguisse a regra de ouro: nunca use PL/SQL quando puder usar o 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 ; 

Não é verificado para sintaxe (ou que corresponde exatamente à sua lógica incidentalmente), mas isso é mais rápido e menos complexo que a metodologia explícita do cursor. Além disso, o compromisso dentro do cursor é uma prática muito ruim.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top