我正在创建一个触发器,用于在票证状态从未付款(3)变为已付款(4)时激活的票证表。我还必须打印一条消息,说票证A是在B上支付的,其中A是票证ID,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行
非常感谢您的帮助!
答案 0 :(得分:2)
ORA-01861:文字与格式字符串不匹配
当我们尝试将字符串转换为日期并且Oracle无法识别字符串格式时,就会发生这种情况。所以这里就是这一行:
where tid=4 and paydate= '2018-11-24';
您似乎正在尝试使用ASCII日期文字,但您缺少date
关键字。试试这个:
where tid=4 and paydate= date '2018-11-24';
我运行了更新,没有行正在更新
这表明您没有符合这些条件的记录。如果您希望更新行,建议您查看paydate
的 precise 值。 Oracle DATE数据类型包含一个时间元素:如果用(例如)sysdate
填充表,则日期中的时间元素与date '2018-11-24'
不匹配(午夜)。
在这种情况下,您应该更改WHERE子句以留出时间:
where tid=4
and paydate >= date '2018-11-24'
and paydate < date '2018-11-25';