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