2009-11-11 130 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