ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oralce datatype-long

oralce datatype-long

原创 Linux操作系统 作者:regonly1 时间:2009-02-10 17:31:29 0 删除 编辑

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

上一篇: 发现RHCE还真挺难
请登录后发表评论 登录
全部评论

注册时间:2008-05-10

  • 博文量
    257
  • 访问量
    1048433