在PLSQL中创建触发器-接收错误消息

时间:2018-11-24 05:10:47

标签: oracle plsql database-trigger

我正在创建一个触发器,用于在票证状态从未付款(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行

非常感谢您的帮助!

1 个答案:

答案 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';