ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 对应定义结构获取

对应定义结构获取

原创 Linux操作系统 作者:regonly1 时间:2009-02-18 15:25:05 0 删除 编辑

函数:w_func_getobjectddl(object_type varchar2, object_name varchar2)
参数说明:
object_type指对象类型,如INDEX,TABLE等;
object_name指对象的名称。
目前只对索引类型的比较有效,对如定义字段比较多的表等对象还不能很好查询。
以后进行优化。
几个重要信息:
1、管道输出,返回的结果是一个结果集,需要用table函数来转换输出;
2、对换行符(chr(3)/chr(10))的替换等内容;
3、返回的类型type_xmlstring是单独定义的一个类型,是一个字符串数组。


使用方式:
Connected to Oracle9i Enterprise Edition Release 9.2.0.8.0
Connected as dvbcetus_sup
 
SQL> select * from table(w_func_getobjectddl('INDEX', 'IDX_REG_AREA'));
 
COLUMN_VALUE
--------------------------------------------------------------------------------
--IDX_REG_AREA
  create index dvbcetus_sup.idx_reg_area on dvbcetus_sup.tmp_tool_regionaccinfo
pctfree 10 initrans 2 maxtrans 255 nologging
storage(initial 81920 next 81920 minextents 1 maxextents 2147483645  pctincrease
tablespace indx;
 
函数体:
create or replace function w_func_getobjectddl(object_type varchar2,  object_name varchar2)
return type_xmlstring pipelined as
/*Created by Lyon@20090218
* 提取对象定义信息
*/
     v_rstr  varchar2(1000);
     v_len   number(4) := 1;
     v_stpos number(4) := 0;
     v_ptpos number(4) := 0;
     v_tbpos number(4) := 0;
     v_strt  number(4) := 1;
     v_sublen number(4) := 0;
     v_head varchar2(255);
     v_mid1 varchar2(255);
     v_mid2 varchar2(255);
     v_tail varchar2(255);
     v_filterstr varchar2(1000);
     v_userprefix varchar2(30) := '"'; --指定要过滤的字符串
     v_clob clob;

Begin
      begin
           --获取对象的定义信息
           v_clob := dbms_metadata.get_ddl(object_type, object_name);
           v_len := dbms_lob.getlength(v_clob);

           --读取clob内容到字符串变量中
           dbms_lob.read(v_clob, v_len, v_strt, v_rstr);

           v_filterstr := replace(replace(replace(v_rstr, chr(3)), chr(10)), v_userprefix); --过滤掉换行符
           v_filterstr := lower(v_filterstr);
           v_len := length(v_filterstr);
           v_ptpos := instr(v_filterstr, 'pctfree'); --在pctfree处进行截断
           v_stpos := instr(v_filterstr, 'storage') ; --在storage处进行截断
           v_tbpos := instr(v_filterstr, 'tablespace'); --在tablespace处进行截断

           v_head := substr(v_filterstr,1, v_ptpos - 1);
           v_mid1 := substr(v_filterstr, v_ptpos, v_stpos - v_ptpos - 1);
           v_mid2 := substr(v_filterstr, v_stpos, v_tbpos - v_stpos - 1);
           v_tail     := substr(v_filterstr, v_tbpos, v_len - v_tbpos - 1) || ';';

           pipe row('--' || object_name);
           pipe row(v_head);
           pipe row(v_mid1);
           pipe row(v_mid2);
           pipe row(v_tail);
      exception when others then
                 dbms_output.put_line('Error: ' || object_name);
      end;
      return;
End w_func_getobjectddl;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12932950/viewspace-555227/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-05-10

  • 博文量
    257
  • 访问量
    1028886