oracle - 在 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 行
非常感谢您的帮助!
解决方案
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';
推荐阅读
- java - FXML 布局的可重用常量?
- html - 在移动设备上输入选择后恢复全屏
- twitter-bootstrap - 导航栏折叠菜单不起作用
- html - html和css如何实现堆叠样式效果?
- javascript - 无法理解 React setState 的异步性
- javascript - React.js 在离开页面或页面刷新时触发事件
- macos - macOS -- 如何在 .vimrc 中安装插件
- racket - 将基准列表转换为球拍中的字符串
- javascript - 将 Jquery 转换为 Javascript (Converter Jquery para Javascript)
- docker - 具有数据持久性的 Elasticsearch docker 映像