Plsql 表达式的类型错误编译触发器时出现错误消息

Plsql 表达式的类型错误编译触发器时出现错误消息,plsql,oracle10g,Plsql,Oracle10g,我得到下面的错误。不知道为什么会出现这个错误。请建议: 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

我得到下面的错误。不知道为什么会出现这个错误。请建议:

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
如果TO_NUMBER(:NEW.DRIVER_NUM)则
不是有效的表达式

我想你想要的是:

如果TO_编号(:NEW.DRIVER_NUM)>0,则


但更重要的是,你的代码毫无意义。我不明白为什么要将一列的内容分配给同一列本身:

 :NEW.DRIVER_NUM := TO_NUMBER(:NEW.DRIVER_NUM);
如果
DRIVER\u NUM
已经是一个数字列,那么这根本没有意义(将数字转换为数字?)

如果
DRIVER\u NUM
是例如
VARCHAR
,那么这就没有什么意义了

请尝试省去“OF DRIVER\u 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;

如果我明白你想做什么,你只想在某个字段上创建一个触发器?这是不必要的,甚至是不可能的。

我的猜测是您正在尝试确保VARCHAR2列驱动程序\u NUM只包含有效的数字-如果不包含,请将其设置为null。如果这是您想要的,请尝试以下方法:

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;

即使触发器编译,但在满足条件时不会触发。例如-:SQL>insert-into-test_驱动程序值('ABC');插入测试驱动程序值('ABC')*第1行错误:ORA-01722:无效数字如果表中的列驱动程序数值定义为数字,则此触发方法将完全无效;我的回答基于以下假设:列是VARCHAR2(正如我所说)。它在数字列上不起作用,因为ORA-01722是在触发器触发之前触发的。如果它是一个varchar,它将是正确的,没有触发器会执行您想要的操作。在我看来,这甚至不是一个好主意:如果用户试图输入“123”,但错误地输入了“12W”,而不是让他们纠正错误,你将存储一个空值……是的,我只需要它。在oracle 10g pragma中,exception_init用于捕获所有sql错误,但不确定它为什么不在这里工作。我的要求是检查属性DRIVER_NUM是否不是数字,如果不是,请在插入触发器之前为其分配null。DRIVER_NUM是一个数字。我想捕获触发器中的sql错误-01722(无效数字),并将其设置为null。