函数: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;