抓取oracle建表语句

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shushugood/article/details/81179701
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

展开阅读全文

没有更多推荐了,返回首页