对系统做了分区表,想获取分区表的分区字段的具体范围信息,找了很多表都无法找到这个信息。最后再看英文资料,发现其实该信息就藏在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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/12932950/viewspace-547184/