oralce datatype-long

regonly1發表於2009-02-10

對系統做了分割槽表,想獲取分割槽表的分割槽欄位的具體範圍資訊,找了很多表都無法找到這個資訊。最後再看英文資料,發現其實該資訊就藏在tabpart$這個表中,從檢視上看就是在[dba/user]_tab_partitions 這個裡面。但是卻是以long的資料型別儲存的。想要檢視這個欄位的具體的值就必須將long型別轉換成可檢視的方式。
如何檢視呢?最終在asktom上找到了一個函式,可以得到對應行的long的值。

create or replace function  getlong( p_tname in varchar2,
                                      p_cname in varchar2,
                                      p_rowid in varchar2 ) return varchar2
 as
     l_cursor    integer default dbms_sql.open_cursor;
     l_n         number;
     l_long_val  varchar2(4000);
     l_long_len  number;
     l_buflen    number := 4000;
     l_curpos    number := 0;
 begin
     dbms_sql.parse( l_cursor,
                    'select ' || p_cname || ' from ' || p_tname ||
                                                      ' where rowid  = cast(:x as rowid)',
                     dbms_sql.native );
     dbms_sql.bind_variable( l_cursor, ':x', p_rowid );
 
     dbms_sql.define_column_long(l_cursor, 1);
     l_n := dbms_sql.execute(l_cursor);
 
     if (dbms_sql.fetch_rows(l_cursor)>0)
     then
        dbms_sql.column_value_long(l_cursor, 1, l_buflen, l_curpos ,
                                   l_long_val, l_long_len );
    end if;
    dbms_sql.close_cursor(l_cursor);
    return l_long_val;
 end getlong;
建立這個函式後,執行:
select getlong('sys.tabpart$', 'hiboundval', cast(rowid  as varchar2(255)))  from sys.tabpart$   tp;即可得到所要檢視的資訊。
不知道是不是還要在函式中指定什麼引數,在普通資料庫使用者下,想在函式中執行對tabpart$表的查詢似乎不成功。
於是建立同義詞來解決這個問題。
在sys下授權select tabpart$表的許可權給普通使用者後,再在這個普通使用者下建立這個表的同義詞:create synonym tabpart$ for sys.tabpart$;即可。
後面可直接呼叫該函式,下面一句SQL語句是用來批次重新命名分割槽的:
select bb.*, 'alter table ' || bb.name || ' rename partition ' || bb.subname || ' to ' || bb.new_partname || ';' from (
select aa.name, aa.subname, 'part_' || substr(aa.name, 4, length(aa.name)) || '_' || to_char(add_months(aa.part_range, -1),  'yyyymm') new_partname
 from (select o.name, o.subname, to_date(substr(getlong('sys.tabpart$', 'hiboundval', cast(tp.rowid  as varchar2(255))), 11, 19), 'yyyy-mm-dd hh24:mi:ss') part_range
 from sys.tabpart$   tp, sys.obj$ o
 where tp.obj# = o.obj#
and o.name in('XX', 'YY','ZZ)
order by o.name ) aa) bb

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12932950/viewspace-547184/,如需轉載,請註明出處,否則將追究法律責任。

相關文章