zoukankan      html  css  js  c++  java
  • Oracle “万年虫”

    一天,有一个Table的需要用到时间来确定数据是否有效,而不是用Delete Flag来明确指定。

    这样,这个Table就多了两个栏位,分别为”生效时间“和”失效时间“。

    那么,我们就要对原来的数据做Data Correction,于是

      ”生效时间“就是"2009/04/01 00:00:00"再加相应的时区,

      ”失效时间“理所当然地成了"9999/12/31 23:59:59"再加相应的时区

    当然,修改了Table和数据后,我们相应的基础数据的维护程式也要做相应的修改了。

    由于系统需要兼容多时区,”失效时间“的数据就有如下这样的数据了:

    万年日期前夕

    数据修正完了后,我们当然要把数据给显示出来了,

    查询数据的时候,当然会以一个时区为基准点来看那些“生效时间”,

    那我们还是”PRC“来看吧,

    查询SQL

    啊!!!!出现问题了(ORA-01877: 内部缓冲区的字符串太长):

    错误信息

     日期没错啊,平时转时区,to_char都好好的,现在怎么了呢,”ORA-01877: 内部缓冲区的字符串太长“,神马情况啊,Oracle bug?

    一步一步,慢慢来,从错误信息来看,最先操作的是"时区转换",屁股想,都会觉得没有问题,可是毕竟屁股没脑袋,还是看下吧:

    转换出来的日期是空的?神了:

    数据时区转换

    原因肯定在这了,把日期数据转换为”PRC“时区后,年份会跨到10000年,但Oracle最大的年只能为9999,一万年太久,长长久久就好:

            ORA-01841: (全)年度值必须介于 -4713 和 +9999 之间,且不为 0

     所以,至此,只有把那个最大的”失效时间“调整为前一年的最后一个时刻,也就是”9998/12/31 23:59:59“+相应时区。

    这样,一切都正常了,一切都如常平淡了.........................(此处省略好多字)........

  • 相关阅读:
    Web测试与App测试的区别-总结篇
    Shell之基本用法
    Samba服务部署
    Linux基础(3)
    linux基础(2)
    linux基础(2)
    Linux基础(1)
    网络基础及网络协议
    操作系统简介
    计算机基础重要性
  • 原文地址:https://www.cnblogs.com/hugh251325/p/2945977.html
Copyright © 2011-2022 走看看