您好,登錄后才能下訂單哦!
本篇內容介紹了“Oracle怎么查詢Interval partition分區表內數據”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
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表都可以
(1)如果知道分區的名字,可以直接查詢對應的分區名
SYS@cams> select count(*) from cams_core.bp_voucher_history partition(SYS_P82);
COUNT(*)
----------
2844459
(2)如果不知道分區的名字,但是知道分區主鍵的字段值范圍,可以基于分區范圍進行查詢
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)如果不知道分區的名字,也不知道分區主鍵的字段值范圍,可以使用PARTITION FOR子句進行查詢,比如現在只知道2017-01-15是這個分區的數據
SYS@cams> select count(*) from cams_core.bp_voucher_history partition for(to_date('2017-01-15','yyyy-mm-dd'));
COUNT(*)
----------
2844459
注:PARTITION FOR子句可以用于指定分區,而不使用分區的名字。
因為Oracle并沒有提供直接的方法用于指定某個日期屬于哪個分區,所以這里要借助于dba_tab_partitions的high_value。但是這里又有一個問題,high_value是Long類型的,不能使用to_date或者to_char函數直接進行轉化。
所以,要解決根據分區字段值查詢分區的問題,本文的解決方案是把Oracle數據庫的Long類型轉化為varchar2類型或者date類型,然后進行比對,查找出分區的名字。
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; end; /
同理,對于使用數字進行自動分區的情況,也可以通過類似的方法進行處理。
從MOS上找到的用于將high_value轉化為varvhar2類型的方法,這里進行分享(已經對部分參數進行修改):
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分區表內數據”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。