开发者社区> 问答> 正文

ORACLE按照字符日期分区遇到一点麻烦。?报错

数据库中的表有个日期字段,字符类型的,是年和月放在一起的。比如“2014-09”这样

我想要根据这个字段拆开月份进行分区,但是这样貌似不太行,单独的月份字段肯定就可以,大家看看这种情况该怎么分区。

create table CBFX_DETAIL_FINANCE
(
  C_VOUCHERID       VARCHAR2(200),
  C_PERIOD          VARCHAR2(7),
  D_CREATEDATE      VARCHAR2(100),
  C_USERID          VARCHAR2(100),
  C_USERNAME        VARCHAR2(200),
  C_BATCH           VARCHAR2(200),
  C_ABSTRACT        VARCHAR2(600),
  C_ABSTRACT_ROW    VARCHAR2(600),
  C_SOURCE          VARCHAR2(200),
  C_ALLCOST         VARCHAR2(200),
  C_UNITNO          VARCHAR2(100),
  C_UNITDESCRIPTION VARCHAR2(200),
  C_DEPARTMENTNO    VARCHAR2(200),
  C_DEPARTMENTNAME  VARCHAR2(200)
)
partition by range (substr(C_PERIOD,6))
   (
   partition GLKJ_DATASZICHAN_PT_01 values  less than ('01')   tablespace MONTH01,
   partition GLKJ_DATASZICHAN_PT_02 values  less than ('02')   tablespace MONTH02,
   partition GLKJ_DATASZICHAN_PT_03 values  less than ('03')   tablespace MONTH03,
   partition GLKJ_DATASZICHAN_PT_04 values  less than ('04')   tablespace MONTH04,
   partition GLKJ_DATASZICHAN_PT_05 values  less than ('05')   tablespace MONTH05,
   partition GLKJ_DATASZICHAN_PT_06 values  less than ('06')   tablespace MONTH06,
   partition GLKJ_DATASZICHAN_PT_07 values  less than ('07')   tablespace MONTH07,
   partition GLKJ_DATASZICHAN_PT_08 values  less than ('08')   tablespace MONTH08,
   partition GLKJ_DATASZICHAN_PT_09 values  less than ('09')   tablespace MONTH09,
      partition GLKJ_DATASZICHAN_PT_10 values  less than ('10')   tablespace MONTH10,
   partition GLKJ_DATASZICHAN_PT_11 values  less than ('11')   tablespace MONTH11,
    partition GLKJ_DATASZICHAN_PT_12 values  less than ('12')   tablespace MONTH12,
    partition GLKJ_DATASZICHAN_PT_13 values  less than (maxvalue)   tablespace allcost
   );
会报错: ora-00907: 缺失右括号!

展开
收起
爱吃鱼的程序员 2020-06-14 20:06:35 870 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    这个错误算是oracle的一个bug了,有时候同一SQL不同版本的oracle执行会遇到该问题。
    建议:
    1、2014-09改成201409
    2、分区语句就不需要substr了,partitionbyrange(年月)(partitionp1valueslessthan('201401'),
    partitionp2valueslessthan('201402'),
    partitionp12valueslessthan('201412'));

    你说的也是可行的,但是最终老大还是想了个不是办法的办法,加个字段专门放月份,将月份update进去,用这个字段分区了。谢谢你!
    2020-06-14 20:06:51
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
PostgresChina2018_樊文凯_ORACLE数据库和应用异构迁移最佳实践 立即下载
PostgresChina2018_王帅_从Oracle到PostgreSQL的数据迁移 立即下载
Oracle云上最佳实践 立即下载

相关镜像