Создание триггера в PLSQL - получение сообщения об ошибке - PullRequest
0 голосов
/ 24 ноября 2018

Я создаю триггер, который для таблицы билетов активируется, когда статус билета меняется с не оплаченного (3) на оплаченный (4).Я также должен распечатать сообщение о том, что билет A оплачен на B, где A - идентификатор билета, а B - дата платежа.

До сих пор я не смог успешно распечатать дату, когда билетоплачивается.

Мой прогресс на данный момент:

create or replace trigger change_ticket_status
after update on car_ticket
for each row when (new.status<> old.status)
begin
dbms_output.put_line('Ticket status is ' ||:new.status || ' (paid).' );
dbms_output.put_line('Ticket ID' || :new.tid || ' was paid on' || :new.paydate);
end;

тестирование:

 update car_ticket
set status=2
where tid=4 and paydate= '2018-11-24';

таблица car_ticket:

(tid int, --- parking ticket id
cid int, --- the car that violated parking regulations
lid int, --- lot where violation took place
ttype int, -- ticket type
status int, --- 3 issued, 4 paid, 
tdate date, --- ticket issue date
paydate date, --- date ticket is paid
note varchar(50), --- notes about the violation
primary key(tid), 
foreign key(cid) references car,
foreign key (ttype) references ticket_type,
foreign key (lid) references lot
);

Результат:

Триггер создан

Результат для тестирования:

ORA-01861: литерал не соответствует строке формата
ORA-06512: в "SYS.DBMS_SQL",линия 1721

Ваша помощь очень ценится!

1 Ответ

0 голосов
/ 24 ноября 2018

ORA-01861: литерал не соответствует строке формата

Это происходит, когда мы пытаемся преобразовать строку в дату, а Oracle не распознает формат строки.Таким образом, здесь будет следующая строка:

 where tid=4 and paydate= '2018-11-24';

Похоже, вы пытаетесь использовать литерал даты ASCII, но вам не хватает ключевого слова date.Попробуйте это:

where tid=4 and paydate= date '2018-11-24';

Я запустил обновление, и ни одна строка не обновляется

Это означает, что у вас нет записей, соответствующих этим критериям.Если вы ожидаете обновления строк, я предлагаю вам взглянуть на точные значения paydate.Типы данных Oracle DATE содержат элемент времени: если вы заполнили свою таблицу, скажем, sysdate, у вас будут даты с элементами времени, которые не соответствуют date '2018-11-24' (полночь).

В этом случаеВы должны изменить предложение WHERE, чтобы учесть время:

where tid=4 
and paydate >= date '2018-11-24' 
and paydate < date '2018-11-25';
...