oralce datatype-long

对系统做了分区表,想获取分区表的分区字段的具体范围信息,找了很多表都无法找到这个信息。最后再看英文资料,发现其实该信息就藏在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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值