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

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

  • 相关阅读:
    Linux主要shell命令详解(下)
    mget命令, ftp命令详解
    VI 基本可视模式
    vim使用技巧
    cd及目录快速切换
    du命令解决linux磁盘空间满的问题(很不错的哦)
    Mysql删除数据后磁盘空间未释放的解决办法【转】
    MYSQL-innodb性能优化几个点
    Apache服务器出现Forbidden 403错误提示的解决方法总结
    MySQL 分区表原理及数据备份转移实战
  • 原文地址:https://www.cnblogs.com/hugh251325/p/2945977.html
Copyright © 2011-2022 走看看