抓取oracle建表语句的代码实例教程
set echo off;
set feedback off;
set pagesize 0;
set trimspool on;
set linesize 10000;
set heading off;
set term off;
set showmode off;
set verify off;
drop table tmp_tabsql;
create table tmp_tabsql (
seq number,
table_name varchar2(50),
table_sql varchar2(4000)
);
declare
v_notparttable varchar2(1000):= '&2';
--v_sql clob;
v_parttype varchar2(20);
v_partcolumn varchar2(50);
v_subparttype varchar2(50);
v_subpartsql varchar2(4000);
v_seq number := 10;
begin
for v_cur in (
select table_name,partitioned,t.tablespace_name,t.pct_free, t.logging, t.cache from user_tables t
where partitioned = 'yes'
) loop
v_seq := v_seq + 1;
insert into tmp_tabsql(seq,table_name,table_sql) values(v_seq, v_cur.table_name, 'create table ' || v_cur.table_name || '(' );
--columns
for v_column in (
select case when regexp_like (column_name,'^\d+$') then '"'||column_name||'"' else column_name end column_name, data_type,data_length, data_precision,data_scale,column_id from user_tab_columns
where table_name = v_cur.table_name
order by column_id asc
) loop
v_seq := v_seq + 1;
insert into tmp_tabsql(seq, table_name, table_sql) values(v_seq, v_cur.table_name,
case when v_column.column_id <> 1 then ' ,' end
|| v_column.column_name || ' ' || v_column.data_type
|| case v_column.data_type when 'timestamp(6)' then '' when 'date' then ''
when 'clob' then '' when 'blob' then ''
when 'number' then
case
when v_column.data_scale is not null and v_column.data_precision is not null then '('||v_column.data_precision||','||v_column.data_scale||')'
when v_column.data_precision is not null then '(' || v_column.data_precision|| ')'
end
else
case when v_column.data_length is not null then '(' || v_column.data_length || ')' end
end
);
end loop;
v_seq := v_seq + 1;
insert into tmp_tabsql(seq, table_name, table_sql) values(v_seq, v_cur.table_name, ')');
if v_cur.partitioned = 'yes' then
select t.partitioning_type, t.subpartitioning_type , tk.column_name
into v_parttype, v_subparttype, v_partcolumn
from user_part_tables t, user_part_key_columns tk
where t.table_name = tk.name
and t.table_name = v_cur.table_name
;
v_seq := v_seq + 1;
insert into tmp_tabsql(seq, table_name, table_sql) values(v_seq, v_cur.table_name,
' pctfree 0 nologging partition by ' || v_parttype ||'('||v_partcolumn||')' );
-- subpartition
v_subpartsql := '';
if v_subparttype <> 'none' then
select t.column_name into v_partcolumn from user_subpart_key_columns t
where t.name = v_cur.table_name
;
v_subpartsql := 'subpartition by '|| v_subparttype ||'('|| v_partcolumn ||') subpartition template (' ||chr(10);
for v_tmp in (select t.subpartition_name, t.high_bound, t.subpartition_position
from user_subpartition_templates t
where table_name = v_cur.table_name
order by t.subpartition_position asc
) loop
v_subpartsql := v_subpartsql || case when v_tmp.subpartition_position > 1 then chr(10) ||' ,' end
|| 'subpartition '|| v_tmp.subpartition_name || ' values (' || v_tmp.high_bound || ')'
;
end loop;
v_subpartsql := v_subpartsql || chr(10) || ')' ||chr(10);
end if;
v_seq := v_seq + 1;
insert into tmp_tabsql(seq, table_name, table_sql) values(v_seq, v_cur.table_name,
v_subpartsql || '(partition p2011010100 values less than (to_date(''2011-01-01'',''yyyy-mm-dd'')));'
);
else
v_seq := v_seq + 1;
insert into tmp_tabsql(seq,table_name,table_sql) values(v_seq, v_cur.table_name,
' tablespace ' || v_cur.tablespace_name
|| ' pctfree ' || v_cur.pct_free
|| case trim(v_cur.logging) when 'no' then ' nologging' end
|| case trim(v_cur.cache) when 'y' then ' cache' end
||';'
)
;
end if;
commit;
end loop;
end;
/
spool &1
select table_sql from (
select 'set echo off;' table_sql,0 seq from dual
union all
select 'set feedback off;', 1 seq from dual
union all
select table_sql,seq from tmp_tabsql
union all
select 'exit;',9999999999 seq from dual
) order by seq asc;
spool off;
drop table tmp_tabsql purge;
exit;
建存放sql的表
-- create table create table tmp_tabsql ( seq integer, table_name varchar2(100), table_sql varchar2(3000) )
提取sql:select table_sql from tmp_tabsql order by seq