2011-06-01 59 views
0

我收到以下錯誤。不知道爲什麼會出現這個錯誤。請建議:編譯觸發時表達式是錯誤類型的錯誤消息

SQL> CREATE OR REPLACE TRIGGER test_trigger 
    2 
    3 BEFORE INSERT OR UPDATE OF DRIVER_NUM 
    4 
    5 ON test_driver FOR EACH ROW 
    7 DECLARE 
    8 
    9 Invalid_Number EXCEPTION; 
10 
11 PRAGMA EXCEPTION_INIT(Invalid_Number , -01722); 
12 
13  BEGIN 
14 
15  IF TO_NUMBER(:NEW.DRIVER_NUM) THEN 
16 
17   :NEW.DRIVER_NUM := TO_NUMBER(:NEW.DRIVER_NUM) ; 
18 
19  END IF; 
20 
21  EXCEPTION 
22 
23   WHEN Invalid_Number THEN 
24 
25    :NEW.DRIVER_NUM := NULL; 
26 
27  END; 
/
28 
Warning: Trigger created with compilation errors. 
SQL> show errors 
Errors for TRIGGER TEST_TRIGGER: 
LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
9/2  PL/SQL: Statement ignored 
9/5  PLS-00382: expression is of wrong type 

回答

1

IF TO_NUMBER(:NEW.DRIVER_NUM) THEN不是一個有效的表達式。

我猜你想要的東西,如:

IF TO_NUMBER(:NEW.DRIVER_NUM) > 0 THEN


但更重要的是,你的代碼沒有任何意義可言。我不明白爲什麼你分配一個列的內容相同的列本身:

:NEW.DRIVER_NUM := TO_NUMBER(:NEW.DRIVER_NUM); 

如果DRIVER_NUM已經是一個數字列,這並不在所有的意義(數字轉換成數?)。

如果DRIVER_NUM是例如一個VARCHAR這會是個偶數讀少

0

嘗試取消「DRIVER_NUM的」,用這樣的:


/* Formatted on 1/06/2011 9:10:59 (QP5 v5.114.809.3010) */ 
CREATE OR REPLACE TRIGGER test_trigger 
    BEFORE INSERT OR UPDATE ON test_driver 
    FOR EACH ROW 
DECLARE 
    INVALID_NUMBER EXCEPTION; 
    PRAGMA EXCEPTION_INIT (INVALID_NUMBER, -01722); 
BEGIN 
    IF TO_NUMBER (:NEW.DRIVER_NUM) 
    THEN 
     :NEW.DRIVER_NUM := TO_NUMBER (:NEW.DRIVER_NUM); 
    END IF; 
EXCEPTION 
    WHEN INVALID_NUMBER 
    THEN 
     :NEW.DRIVER_NUM := NULL; 
END; 

如果我明白你正在嘗試做的,你想創建一個觸發器只有某些領域?這不是必要的,或者甚至對於這個問題來說都是可能的。

+0

我的要求是,以檢查屬性DRIVER_NUM不是一個數字,如果在我的觸發插入之前使null分配給它。 DRIVER_NUM是一個NUMBER.I想要在我的觸發器中捕獲sql錯誤-01722(無效數字)並將其設置爲空。 – arpita 2011-06-01 10:47:14

1

我的猜測是你試圖確保VARCHAR2列DRIVER_NUM只包含有效數字 - 如果沒有,將其設置爲空。如果這是你想要的東西,試試這個:

CREATE OR REPLACE TRIGGER test_trigger 
BEFORE INSERT OR UPDATE OF DRIVER_NUM 
ON test_driver 
FOR EACH ROW 
DECLARE 
    Dummy NUMBER; 
    Invalid_Number EXCEPTION; 
    PRAGMA EXCEPTION_INIT(Invalid_Number , -01722); 
BEGIN 
    Dummy := TO_NUMBER(:NEW.DRIVER_NUM) ; 
EXCEPTION 
    WHEN Invalid_Number THEN 
     :NEW.DRIVER_NUM := NULL; 
END; 
+0

謝謝託尼觸發器工作正常,沒有錯誤! – arpita 2011-06-01 10:31:57

+0

事件發生時觸發器編譯,但遇到條件時不會觸發。像 - :SQL>插入到test_driver值('ABC'); ('ABC') * ERROR at line 1: ORA-01722:invalid number – arpita 2011-06-01 10:33:00

+0

如果表中的列DRIVER_NUM被定義爲NUMBER,那麼這個觸發器方法根本不起作用;我的回答是基於列是VARCHAR2的假設(如我所說)。它不會在NUMBER列上工作,因爲ORA-01722在觸發器被觸發之前就被觸發了。 – 2011-06-01 10:45:35