2009-11-11 64 views
0

我的方法:的Oracle 10g - ORA-01747错误

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 

我没有看到我的代码中的任何保留字,为什么我会得到这个错误?

回答

4

你必须在

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

愚蠢的错误:) – 2009-11-11 22:17:41

+3

发生在我们所有人身上! – 2009-11-11 22:18:57

5

也许,如果你遵循的金科玉律,你会避免错误的外来逗号:切勿使用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 ; 

未检查用于语法(或者它与您的逻辑顺序完全匹配),但这比明确的游标方法更快更简单。在光标内提交也是非常糟糕的做法。

+2

+1对于“在光标内部提交是非常糟糕的做法”;假设你的意思是不正确的做法,如“导致程序失败与ORA-01555快照太旧错误” – 2009-11-12 08:42:01

+4

部分原因是由于ORA-01555的,但也由于日志文件同步导致性能下降,并且它通常不是商业交易的结束是应该发生的地方。 – 2009-11-12 09:44:28