Выражение имеет неверный тип сообщения об ошибке при компиляции триггера - PullRequest
0 голосов
/ 01 июня 2011

Я получаю сообщение об ошибке ниже. Не знаю, почему эта ошибка появляется. Пожалуйста, предложите:

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

Ответы [ 3 ]

1 голос
/ 01 июня 2011

Полагаю, вы пытаетесь убедиться, что столбец VARCHAR2 DRIVER_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;
1 голос
/ 01 июня 2011

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 голосов
/ 01 июня 2011

Попробуйте опустить "OF 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;

Если я понимаю, что вы пытаетесь сделать, вы хотите создать триггер только для определенного поля?Это не обязательно, или даже не возможно в этом отношении. Afaik.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...