代码之家  ›  专栏  ›  技术社区  ›  Richard Knop

Oracle 10g-ORA-01747错误

  •  0
  • Richard Knop  · 技术社区  · 15 年前

    我的程序:

    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;
    

    当我尝试在Oracle10gExpressEdition中运行该代码时,我得到了以下错误:

    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 回复  |  直到 15 年前
        1
  •  4
  •   Jim Garrison    15 年前

    你有一个多余的逗号

            UPDATE Auta SET
                poplatok_denny = denny_poplatok,
            WHERE id_auto = my_id_auto;        
    
        2
  •  5
  •   David Aldridge    15 年前

    如果遵循黄金法则,可能会避免一个错误:当可以使用SQL时,不要使用PL/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 ; 
    

    没有检查语法(或者顺便说一下,它与您的逻辑完全匹配),但是这比显式游标方法更快,也不那么复杂。另外,光标内的提交也是非常糟糕的做法。

    推荐文章