首页 > 解决方案 > 在 PLSQL 中创建触发器--接收错误消息

问题描述

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

非常感谢您的帮助!

标签: oracleplsqldatabase-trigger

解决方案


ORA-01861: 文字与格式字符串不匹配

当我们尝试将字符串转换为日期并且 Oracle 无法识别字符串的格式时,就会发生这种情况。所以这将是这条线:

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

看起来您正在尝试使用 ASCII 日期文字,但您缺少date关键字。尝试这个:

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

我运行了更新,没有行更新

这表明您没有符合这些条件的记录。如果您希望更新行,我建议您查看. paydateOracle DATE 数据类型包含一个时间元素:如果您一直在使用(比如说)填充您的表,sysdate那么您将拥有不匹配的时间元素的日期date '2018-11-24'(午夜)。

在这种情况下,您应该更改 WHERE 子句以留出时间:

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

推荐阅读