Триггер для проверки взносов - PullRequest
1 голос
/ 17 декабря 2011

Мне нужен триггер для проверки перерасходов.

Если он истек, он должен поместить некоторые детали из таблицы, называемой ссудой, в таблицу, называемую штрафом, со штрафом, но созданный мной триггервыдача ошибок компиляции.

SQL> CREATE OR REPLACE TRIGGER Over_Due
  2  AFTER INSERT OR UPDATE ON loan_table
  3  FOR EACH ROW
  4  DECLARE due_date DATE;
  5  BEGIN
  6  SELECT COUNT(*) INTO due_date FROM loan_table l
  7     WHERE l.date_due = :new.date_due;
  8     IF(date_due > SYSDATE)
  9     THEN
 10  INSERT INTO fine_table VALUES(fine_id, :old.loan_id,:old.book_id,:old.student_id,amount);
 11  END IF;
END; 12
 13  /

 Warning: Trigger created with compilation errors.

 SQL> show errors;
 Errors for TRIGGER OVER_DUE:

 LINE/COL ERROR
 -------- -----------------------------------------------------------------
 3/1      PL/SQL: SQL Statement ignored
 3/8      PL/SQL: ORA-00932: inconsistent datatypes: expected DATE got
         NUMBER

Ответы [ 3 ]

2 голосов
/ 18 декабря 2011

Существует большая проблема с вашим дизайном: триггеры основаны на событии - ваш срабатывает только при получении кредита new . Что произойдет, если книга просрочена, и никто не одалживает книгу некоторое время? Ответ - ничего! Просроченное обнаружение не производится до тех пор, пока книга не будет заимствована. Кроме того, одна и та же проверка выполняется каждый раз, когда заимствуется книга, что слишком часто.

Вместо этого вам нужна периодическая проверка всех записей - я бы рекомендовал один раз в день, приуроченный к запуску после закрытия библиотеки (чтобы ваша обработка не влияла выполнение транзакций), которая проверяет наличие просроченных книг.

0 голосов
/ 17 декабря 2011

Ваша проблема, кажется,

SELECT COUNT(*) INTO due_date

COUNT(*) никогда не будет DATE типа.

Вы, вероятно, хотите изменить его как

...
DECLARE due_date DATE;
BEGIN
SELECT l.date_due INTO due_date FROM loan_table l
    WHERE l.date_due = :new.date_due ORDER BY l.date_due ASC LIMIT 1;
    IF(due_date > SYSDATE)
    THEN
...

, который проверит самый старый l.date_due против SYSDATE и выполнит вставку соответственно. Если вам нужно что-то еще, вам нужно быть более конкретным.

0 голосов
/ 17 декабря 2011

Вы присваиваете значение Count (*) (число) в поле DATE (due_date).

Я подозреваю, что вы намерены сделать здесь:

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