背景:
在做oracle的数据库同步时发现,创建的行级触发器获取表的时间戳数据时含有中文,导致入库时转义乱码,条件匹配失败。
调试过程:
写了一个declare脚本测试:
declare
--类型定义
cursor c_job IS select * from A041;
--定义一个游标变量
c_row c_job%rowtype;
begin
open c_job;
loop
--提取一行数据到c_row
fetch c_job into c_row;
--判读是否提取到值,没取到值就退出
--取到值c_job%notfound 是false
--取不到值c_job%notfound 是true
exit when c_job%notfound;
dbms_output.put_line(c_row.STIMESTAMPZ);
end loop;
--关闭游标
close c_job;
end;
输出结果:
字段STIMESTAMPZ 是 TIMESTAMP WITH TIME ZONE 。
抓包工具分析入库sql:
问题就在中文转义问题。解决的核心就是取消中文。
解决方式
查询和入库时,都用下面介绍的指定格式。
表结构:
STIMESTAMP TIMESTAMP
STIMESTAMPLZ TIMESTAMP WITH LOCAL TIME ZONE
STIMESTAMPZ TIMESTAMP WITH TIME ZONE
sql字段获取方式:
select
to_char("STIMESTAMP", 'YYYY-MM-DD HH24:MI:SS:FF6'),
to_char("STIMESTAMPLZ", 'YYYY-MM-DD HH24:MI:SS:FF6'),
to_char("STIMESTAMPZ", 'YYYY-MM-DD HH24:MI:SS:FF6 TZH:TZM TZR TZD')
from A041
结束!