我们用到的一张表因为资料量比较大,DBA给改成了分区表,按照其中的一个date型字段trans_date分的区
.....
.....
partition SLTS9 values less than (TO_DATE(' 2007-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
.....
.....
存储过程:
create or replace procedure test(date1 in varchar2,date2 in varchar2) is
......
cursor buf is
select columnname from tablename where 
trans_date between to_date(date1,'yyyy/mm/dd') and to_date(date2,'yyyy/mm/dd');
begin
......
调试的时候随便给date1,date2赋两个值'2008/04/04','2008/04/05',执行这个游标的时候,报错ORA-01841: (全)年度值必须介于 -4713 和 +9999 之间,且不为 0
我把存储过程的时间参数换成常量的执行就通过了。
cursor buf is
select columnname from tablename where 
trans_date between to_date('2008/04/04','yyyy/mm/dd') and to_date('2008/04/05','yyyy/mm/dd');问题应该就出在时间格式上,分区表换成普通表执行也没有问题。
估计是那个时间字段的分区格式(TO_DATE(' 2007-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))有些问题,可是说不清楚是什么问题,也不好要求DBA改回来,因为换成常量执行都正常,其他程序执行SQL都没问题。郁闷。

解决方案 »

  1.   

    分区用values less than (TO_DATE('2007/03/01', 'YYYY/MM/DD', 'NLS_CALENDAR=GREGORIAN')) 试试。或者你的存储过程的参数更改和分区条件一样的看看。
      

  2.   

    更改存储过程的date格式,和分区的date格式一致
      

  3.   

    改这个
    trans_date between to_date(date1,'yyyy/mm/dd') and to_date(date2,'yyyy/mm/dd')

    to_date(to_char(trans_date,'yyyymmdd'),'yyyy/mm/dd') between to_date(date1,'yyyy/mm/dd') and to_date(date2,'yyyy/mm/dd')
      

  4.   

    values less than (TO_DATE(' 2007-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) 分区的日期格式挺奇怪啊!关注!
      

  5.   

    问了DBA,他说分区的时候用的脚本只是
    values less than (TO_DATE('2007-03-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
    不知道为什么我在PL/SQL中看到的却是
    values less than (TO_DATE(' 2007-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))to  qiyousyc,CathySun118 :
    改成
    cursor buf is 
    select columnname from tablename where  
    trans_date between to_date(date1,'syyyy-mm-dd hh24:mi:ss') and to_date(date2,'syyyy-mm-dd hh24:mi:ss'); 
    date1,date2赋值'2008/04/04 07:00:00','2008/04/05 07:00:00'
    测试会报另一个错误ORA-01858: 在应为数值之处发现一个非数值的字元to  airson79 :
    还是报ORA-01841: (全)年度值必须介于 -4713 和 +9999 之间,且不为 0
      

  6.   

     to_date(date1,'syyyy-mm-dd hh24:mi:ss')
     to_date(date1,'yyyy-mm-dd hh24:mi:ss')