• 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“+相应时区。

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

  • 相关阅读:
    灰度发布
    rabbitmq应用场景
    redis设置cpu核数与内存
    使用word2010发布博客到博客园
    讲师
    UML-6.3-用例-详述示例
    UML-6.2-用例-用例模型/用例/场景关系
    UML-6.1-用例-示例
    数据库增量同步开源软件
    UML-5-进化式需求
  • 原文地址:https://www.cnblogs.com/hugh251325/p/2945977.html
Copyright © 2020-2023  润新知