如何查詢user_tab_partitions 視圖的 HIGH_VALUE字段?

有時候我們需要查詢分區表確定分區的大小。就需要查詢user_tab_partitions 視圖的 HIGH_VALUE字段。

但是會發現這個字段的類型 是LONG 類型。例如:

SQL> desc user_tab_partitions;
Name                   Type         Nullable Default Comments
---------------------- ------------ -------- ------- --------
TABLE_NAME             VARCHAR2(30) Y                         
COMPOSITE              VARCHAR2(3)  Y                         
PARTITION_NAME         VARCHAR2(30) Y                         
SUBPARTITION_COUNT     NUMBER       Y                         
HIGH_VALUE             LONG         Y                         
HIGH_VALUE_LENGTH      NUMBER       Y                         
PARTITION_POSITION     NUMBER       Y                         
TABLESPACE_NAME        VARCHAR2(30) Y                        

sqlplus 裏面顯示是TO_DATE 具體的內容:

SQL> select t.table_name, t.partition_name, t.high_value
  2    from user_tab_partitions t
  3   where t.table_name = 'PART_IND_TEST'
  4     and t.partition_name = 'P_201401';

TABLE_NAME                     PARTITION_NAME                 HIGH_VALUE
------------------------------ ------------------------------ ------------------------------------------------------------------------------------------
PART_IND_TEST                  P_201401                       TO_DATE(' 2014-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')

查詢得到的內容是   TO_DATE(' 2014-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')

但是更多的時候需求是希望得到2014-02-01 00:00:00 這個時間。

並且在PL/SQL Developer 查詢出來不是顯示具體的內容

創建一個函數,可以巧妙的繞過這個問題:

create or replace function fun_high_value(p_tname   varchar2,
                                          p_parname varchar2)
  return varchar2 is
  l_high_value varchar2(1000);
begin
  select t.high_value
    into l_high_value
    from user_tab_partitions t
   where t.table_name = p_tname
     and t.partition_name = p_parname;
  return l_high_value;
end;

select table_name,
       partition_name,
       fun_high_value(table_name, partition_name) high_value,
       substr(fun_high_value(table_name, partition_name), 10, 11)
  from user_tab_partitions t
 where t.table_name = 'PART_IND_TEST'
   and t.partition_name = 'P_201401';

TABLE_NAME                     PARTITION_NAME                 HIGH_VALUE                                                                                 SUBSTR(FUN_HIGH_VALUE(TABLE_NAME,PARTITION_N
------------------------------ ------------------------------ ------------------------------------------------------------------------------------------ --------------------------------------------
PART_IND_TEST                  P_201401                       TO_DATE(' 2014-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')         2014-02-01

另外一個辦法是使用XML db的語法查詢。也能實現同樣的需求:

select *
  from (with xml as (SELECT dbms_xmlgen.getXMLType('select table_name, partition_name, high_value
                                 from user_tab_partitions t
                                where t.table_name = ''' ||
                                                   t.table_name || ''' ') as x
                       from user_tables t
                      where t.TABLE_NAME in ('PART_IND_TEST'))
         select extractvalue(rws.object_value, '/ROW/TABLE_NAME') TABLE_NAME,
                extractvalue(rws.object_value, '/ROW/PARTITION_NAME') PARTITION_NAME,
                extractvalue(rws.object_value, '/ROW/HIGH_VALUE') HIGH_VALUE
           FROM XML X, TABLE(XMLSEQUENCE(EXTRACT(X.X, '/ROWSET/ROW'))) rws)
          where partition_name = 'P_201401'

 

如果不想創建函數,數據庫版本是12c以上的話,可以使用with語法:

with function fun_high_value(p_tname varchar2,
p_parname varchar2) return varchar2 is l_high_value varchar2(1000);
begin
  select t.high_value
    into l_high_value
    from user_tab_partitions t
   where t.table_name = p_tname
     and t.partition_name = p_parname;
  return l_high_value;
end;
select table_name,
       partition_name,
       fun_high_value(table_name, partition_name) high_val
  from user_tab_partitions t
 where t.table_name = 'PART_IND_TEST'
   and t.partition_name = 'P_201401'

以上是幾種辦法。你學會了麼?

 

下面是我的公衆號:定期會更新一些Oracle 數據庫及Python相關的學習經驗。歡迎關注:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章