Oracle 10g - ошибка ORA-01747 - PullRequest
       8

Oracle 10g - ошибка ORA-01747

0 голосов
/ 12 ноября 2009

Моя процедура:

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;

Когда я пытаюсь запустить этот код в Oracle 10g Express Edition, я получаю следующую ошибку:

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

Я не вижу зарезервированных слов в своем коде, так почему я получаю эту ошибку?

Ответы [ 2 ]

5 голосов
/ 12 ноября 2009

Вероятно, ошибки вы бы избежали, если бы следовали золотому правилу: никогда не используйте PL / SQL, когда вы можете использовать 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 ; 

Не проверяется на синтаксис (или на то, что он точно совпадает с вашей логикой), но это быстрее и менее сложно, чем методология явного курсора. также фиксация внутри курсора - очень плохая практика.

4 голосов
/ 12 ноября 2009

У вас посторонняя запятая на

        UPDATE Auta SET
            poplatok_denny = denny_poplatok,
        WHERE id_auto = my_id_auto;        
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...