了解Oracle中的系统命名约定

时间:2017-10-02 16:08:27

标签: database oracle database-partitioning

正如documentation中所述,以SYS_ORA_开头的名称由Oracle系统使用:

  

Oracle使用以SYS_开头的系统生成的名称   隐式生成的模式对象和子对象以及名称   对于某些Oracle提供的对象,以ORA_开头。神谕   不鼓励您在明确的名称中使用这些前缀   提供给您的架构对象和子对象以避免可能   名称解析冲突。

我目前正在使用具有分区名称的区间分区表:

SYS_P2672
SYS_P1787
SYS_P654

是否存在一个约定,根据该约定生成分区名称​​ SYS_ 2627 中的整数?特别是,我想预测未来的分区名称,假设我的分区是按月或按周生成的。

1 个答案:

答案 0 :(得分:1)

使用分区扩展名和数据字典,而不是依赖系统名称。

分区扩展名称语法允许SQL语句根据分区内的值而不是实际的分区名称引用分区。

<强>语法:

enter image description here

(还有一个类似的SUBPARTITION版本。)

示例:

--Create and populate sample schema.
--drop table test1;

create table test1(a date)
partition by range(a)
interval (numToDSInterval(1, 'DAY'))
(
    partition p1 values less than (date '2000-01-01')
);

insert into test1
select date '2000-01-01' + level
from dual
connect by level <= 100;

--Select the partition using a value.
select * from test1 partition for (date '2000-01-05');

如果不起作用,则可以通过数据字典检索分区信息。这很棘手,特别是因为HIGH_VALUE作为文本存储在LONG列中。但它在PL / SQL中使用时确实允许完全控制和自动化。

--Must create as a table to convert LONG to CLOB in SQL.
--(This would be easier in PL/SQL, you can just "TO_CHAR" it.)
create table temp_convert_long_to_lob as
select table_name, partition_name, to_lob(high_value) high_value
from user_tab_partitions
where table_name = 'TEST1';

--Show some data about the partitions.
select table_name, partition_name, to_char(high_value) high_value
from temp_convert_long_to_lob
order by partition_name;

TABLE_NAME   PARTITION_NAME   HIGH_VALUE
----------   --------------   ----------
TEST1        P1               TO_DATE(' 2000-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
TEST1        SYS_P3094        TO_DATE(' 2000-01-03 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
TEST1        SYS_P3095        TO_DATE(' 2000-01-04 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
TEST1        SYS_P3096        TO_DATE(' 2000-01-05 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')