使用DBMS_CLOUD创建区间外部分区表报ORA-30657错误如何解决
问题根因
ORA-30657报错的核心原因是Oracle DBMS_CLOUD包的CREATE_EXTERNAL_PART_TABLE接口不支持INTERVAL区间自动分区语法,外部分区表目前仅支持静态预定义分区、或者基于对象存储文件路径的自动分区发现两种模式,不支持传统堆表的区间自动分区特性。
修复方案
方案1:改用静态范围分区(适配现有代码逻辑)
直接删除partitioning_clause中的interval (15)关键字,保留手动定义的两个静态分区即可,修改后的完整可运行代码如下:
BEGIN DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE( table_name =>'PETX', credential_name =>'MY_CRED', format => json_object('delimiter' value '#'), column_list => 'deptno number,dname char(14),loc char(13)', partitioning_clause => 'partition by range (deptno) ( partition xp1 values less than (15) location(''https://swiftobjectstorage.XXXX/xp1_15.txt'') , partition xp2 values less than (30) location (''https://swiftobjectstorage.XXXX/xp2_30.txt'') )' ); END; /
方案2:使用自动分区发现(无需手动维护分区定义)
如果需要动态新增分区不需要反复修改表结构,可以将对象存储的文件按分区列值的目录结构存放,例如路径格式为bucket/前缀/deptno=0/pet.txt、bucket/前缀/deptno=15/pet.txt,使用如下参数创建自动分区外部分区表:
BEGIN DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE( table_name =>'PETX', credential_name =>'MY_CRED', format => json_object('delimiter' value '#'), column_list => 'dname char(14),loc char(13)', -- 分区列不需要写在column_list中 partition_columns => 'deptno number', partition_type => 'RANGE', partitioning_clause => 'partition by range (deptno) (partition p_default values less than (MAXVALUE))', location_uri => 'https://swiftobjectstorage.XXXX/你的bucket前缀/' ); -- 首次执行全量分区发现同步元数据 DBMS_CLOUD.SYNC_EXTERNAL_PART_TABLE('PETX'); END; /
额外注意事项
- 静态分区模式下,新增deptno大于等于30的数据时,需要手动新增对应分区并指定location,否则查询会自动过滤掉这部分数据
- 自动分区发现模式下,每次新增分区文件后,需要执行
DBMS_CLOUD.SYNC_EXTERNAL_PART_TABLE('PETX')同步分区元数据才能识别新分区数据
内容的提问来源于stack exchange,提问作者Hermann Baer
相关产品推荐
相关产品推荐

