共計 3079 個字符,預(yù)計需要花費(fèi) 8 分鐘才能閱讀完成。
本篇內(nèi)容介紹了“Oracle 怎么查詢 Interval partition 分區(qū)表內(nèi)數(shù)據(jù)”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓丸趣 TV 小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
1. 查看分區(qū)信息
select table_name,partition_name,high_value,partition_position,num_rows from dba_tab_partitions where table_owner= CAMS_CORE and table_name= BP_VOUCHER_HISTORY
注:dba_tab_partitions | all_tab_partitions | user_tab_partitions 表都可以
2. 查看分區(qū)內(nèi)數(shù)據(jù)(以 SYS_P82 分區(qū)為例)
(1)如果知道分區(qū)的名字,可以直接查詢對應(yīng)的分區(qū)名
SYS@cams select count(*) from cams_core.bp_voucher_history partition(SYS_P82);
COUNT(*)
———-
2844459
(2)如果不知道分區(qū)的名字,但是知道分區(qū)主鍵的字段值范圍,可以基于分區(qū)范圍進(jìn)行查詢
SYS@cams select count(*) from cams_core.bp_voucher_history partition where ac_dte =to_date(2017-01-01 , yyyy-mm-dd) and ac_dte to_date(2017-02-01 , yyyy-mm-dd
COUNT(*)
———-
2844459
(3)如果不知道分區(qū)的名字,也不知道分區(qū)主鍵的字段值范圍,可以使用 PARTITION FOR 子句進(jìn)行查詢,比如現(xiàn)在只知道 2017-01-15 是這個分區(qū)的數(shù)據(jù)
SYS@cams select count(*) from cams_core.bp_voucher_history partition for(to_date( 2017-01-15 , yyyy-mm-dd
COUNT(*)
———-
2844459
注:PARTITION FOR 子句可以用于指定分區(qū),而不使用分區(qū)的名字。
3. 根據(jù)分區(qū)內(nèi)的分區(qū)字段值,查詢 Interval Partition 分區(qū)的名字
因為 Oracle 并沒有提供直接的方法用于指定某個日期屬于哪個分區(qū),所以這里要借助于 dba_tab_partitions 的 high_value。但是這里又有一個問題,high_value 是 Long 類型的,不能使用 to_date 或者 to_char 函數(shù)直接進(jìn)行轉(zhuǎn)化。
所以,要解決根據(jù)分區(qū)字段值查詢分區(qū)的問題,本文的解決方案是把 Oracle 數(shù)據(jù)庫的 Long 類型轉(zhuǎn)化為 varchar2 類型或者 date 類型,然后進(jìn)行比對,查找出分區(qū)的名字。
set serveroutput on;
declare
my_var date;
begin
for x in (select * from dba_tab_partitions where table_owner= CAMS_CORE and table_name= BP_VOUCHER_HISTORY) loop
execute immediate select || x.high_value || from dual into my_var;
if (my_var = to_date( 2017-02-01 , yyyy-mm-dd)) then
dbms_output.put_line(x.partition_name);
end if;
end loop;
/
同理,對于使用數(shù)字進(jìn)行自動分區(qū)的情況,也可以通過類似的方法進(jìn)行處理。
從 MOS 上找到的用于將 high_value 轉(zhuǎn)化為 varvhar2 類型的方法,這里進(jìn)行分享(已經(jīng)對部分參數(shù)進(jìn)行修改):
select subname,
TO_CHAR(y1*100+y2, 9999) || / ||
TO_CHAR(m, FM09) || / ||
TO_CHAR(d, FM09) || ||
TO_CHAR(hh, FM09) || : ||
TO_CHAR(mi, FM09) || : ||
TO_CHAR(ss, FM09)
from (
SELECT
o.subname, tp.part#,
TO_NUMBER(SUBSTR(RAWTOHEX(CAST(bhiboundval as raw(8))), 3, 2),
XX )-100 y1,
TO_NUMBER(SUBSTR(RAWTOHEX(CAST(bhiboundval as raw(8))), 5, 2),
XX )-100 y2,
TO_NUMBER(SUBSTR(RAWTOHEX(CAST(bhiboundval as raw(8))), 7, 2),
XX ) m,
TO_NUMBER(SUBSTR(RAWTOHEX(CAST(bhiboundval as raw(8))), 9, 2),
XX ) d,
TO_NUMBER(SUBSTR(RAWTOHEX(CAST(bhiboundval as raw(8))), 11, 2),
XX )-1 hh,
TO_NUMBER(SUBSTR(RAWTOHEX(CAST(bhiboundval as raw(8))), 13, 2),
XX )-1 mi,
TO_NUMBER(SUBSTR(RAWTOHEX(CAST(bhiboundval as raw(8))), 15, 2),
XX )-1 ss
from sys.tabpart$ tp, sys.obj$ o, sys.user$ u
where tp.obj# = o.obj# and o.owner# = u.user#
and o.name = BP_VOUCHER_HISTORY and u.name = CAMS_CORE )
order by part#;
with xml as (select dbms_xmlgen.getxmltype( select table_name, partition_name, high_value from dba_tab_partitions where table_name = BP_VOUCHER_HISTORY and table_owner= CAMS_CORE) as x
from dual
select extractValue(rws.object_value, /ROW/TABLE_NAME) table_name,
extractValue(rws.object_value, /ROW/PARTITION_NAME) partition,
extractValue(rws.object_value, /ROW/HIGH_VALUE) high_value
from xml x,
table(xmlsequence(extract(x.x, /ROWSET/ROW))) rws ORDER BY extractValue(rws.object_value, /ROW/TABLE_NAME
“Oracle 怎么查詢 Interval partition 分區(qū)表內(nèi)數(shù)據(jù)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注丸趣 TV 網(wǎng)站,丸趣 TV 小編將為大家輸出更多高質(zhì)量的實(shí)用文章!