了解 Oracle 中的系统命名约定
Understanding system naming convention in Oracle
如 documentation 中所述,Oracle 系统使用以 SYS_
和 ORA_
开头的名称:
Oracle uses system-generated names beginning with SYS_
for
implicitly generated schema objects and subobjects, and names
beginning with ORA_
for some Oracle-supplied objects. Oracle
discourages you from using these prefixes in the names you explicitly
provide to your schema objects and subobjects to avoid possible
conflict in name resolution.
我目前正在使用分区名称的间隔分区 table:
SYS_P2672
SYS_P1787
SYS_P654
是否有生成分区名称 SYS_
2627
中的整数的约定?特别是,假设我的分区是按月或周间隔生成的,我想预测未来的分区名称。
使用分区扩展名称和数据字典,而不是依赖系统名称。
分区扩展名称语法允许 SQL 语句根据分区内的值而不是实际的分区名称来引用分区。
语法:
(也有类似的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')
如 documentation 中所述,Oracle 系统使用以 SYS_
和 ORA_
开头的名称:
Oracle uses system-generated names beginning with
SYS_
for implicitly generated schema objects and subobjects, and names beginning withORA_
for some Oracle-supplied objects. Oracle discourages you from using these prefixes in the names you explicitly provide to your schema objects and subobjects to avoid possible conflict in name resolution.
我目前正在使用分区名称的间隔分区 table:
SYS_P2672
SYS_P1787
SYS_P654
是否有生成分区名称 SYS_
2627
中的整数的约定?特别是,假设我的分区是按月或周间隔生成的,我想预测未来的分区名称。
使用分区扩展名称和数据字典,而不是依赖系统名称。
分区扩展名称语法允许 SQL 语句根据分区内的值而不是实际的分区名称来引用分区。
语法:
(也有类似的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')