抓取oracle建表语句的代码实例教程

抓取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

(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐