Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
![]() |
![]() |
Home -> Community -> Usenet -> c.d.o.server -> Re: how to extract create table scripts from datadictionary views?
This is from the Oracle Press book SQL & PL/SQL Annotated Archives. Run
cre_tbl.sql after you run this script.
set echo off verify off feedback off pagesize 0 term on select 'Creating table build script...' from DUAL;
accept table_name prompt "Enter the name of the Table: " accept tab_owner prompt "Enter table owner: " set term off
drop table TAB_TEMP;
create table TAB_TEMP (
Lineno NUMBER, Id_Owner VARCHAR2(30), Id_Name VARCHAR2(30), Text VARCHAR2(2000))
declare
cursor TAB_CURSOR is
select Owner, Table_Name, Tablespace_Name, Pct_Free, Pct_Used, Ini_Trans, Max_Trans, Initial_Extent, Next_Extent, Min_Extents, Max_Extents, Pct_Increase, Freelists, Freelist_Groups, Degree, Instances from DBA_TABLES where Owner = UPPER('&&tab_owner') and Table_Name like UPPER('&&table_name') order by Table_Name; cursor COL_CURSOR (C_Owner VARCHAR2, C_Tabname VARCHAR2) is select Column_Name, Data_Type, Data_Length, Data_Precision, Data_Scale, Nullable, Default_Length, Data_Default from DBA_TAB_COLUMNS where Owner = C_Owner and Table_Name = C_Tabname order by Column_ID; cursor CONS_CURSOR (Cons_Owner VARCHAR2, Cons_Tablename VARCHAR2) is select A.Owner, A.Constraint_Name, A.Constraint_Type, A.Table_Name, A.Search_Condition, B.Column_Name, B.Position from DBA_CONSTRAINTS A, DBA_CONS_COLUMNS B where A.Owner = B.Owner and A.Constraint_Name = B.Constraint_Name and A.Table_Name = B.Table_Name and A.Constraint_Type in ('C','P') and A.Owner = Cons_Owner and A.Table_Name = Cons_Tablename order by A.Constraint_Type, A.Constraint_Name, B.Position; cursor REF_CURSOR (R_Owner VARCHAR2, R_Tablename VARCHAR2) is select A.Owner, A.Table_Name, A.Constraint_Name, A.R_Constraint_Name, B.Column_Name, C.Owner, C.Table_Name, C.Column_Name, C.Position from DBA_CONSTRAINTS A, DBA_CONS_COLUMNS B, DBA_CONS_COLUMNS C where A.Constraint_Name = B.Constraint_Name and A.Owner = B.Owner and C.Constraint_name = A.R_Constraint_Name and B.Position = C.Position and A.Owner = R_Owner and A.Table_Name = R_Tablename order by A.Constraint_Name, A.Owner, C.Position; Lv_Table_Owner DBA_TABLES.Owner%TYPE; Lv_Table_Name DBA_TABLES.Table_Name%TYPE; Lv_Tablespace_Name DBA_TABLES.Tablespace_Name%TYPE; Lv_Pct_Free DBA_TABLES.Pct_Free%TYPE; Lv_Pct_Used DBA_TABLES.Pct_Used%TYPE; Lv_Initial_Trans DBA_TABLES.Ini_Trans%TYPE; Lv_Max_Trans DBA_TABLES.Max_Trans%TYPE; Lv_Initial_Extent DBA_TABLES.Initial_Extent%TYPE; Lv_Next_Extent DBA_TABLES.Next_Extent%TYPE; Lv_Min_Extents DBA_TABLES.Min_Extents%TYPE; Lv_Max_Extents DBA_TABLES.Max_Extents%TYPE; Lv_Pct_Increase DBA_TABLES.Pct_Increase%TYPE; Lv_Freelists DBA_TABLES.Freelists%TYPE; Lv_Freelist_Groups DBA_TABLES.Freelist_Groups%TYPE; Lv_Degree DBA_TABLES.Degree%TYPE; Lv_Instances DBA_TABLES.Instances%TYPE; Lv_Column_Name DBA_TAB_COLUMNS.Column_Name%TYPE; Lv_Column_Data_Type DBA_TAB_COLUMNS.Data_Type%TYPE; Lv_Column_Data_Length DBA_TAB_COLUMNS.Data_Length%TYPE; Lv_Column_Data_Precision DBA_TAB_COLUMNS.Data_Precision%TYPE; Lv_Column_Data_Scale DBA_TAB_COLUMNS.Data_Scale%TYPE; Lv_Column_Nullable DBA_TAB_COLUMNS.Nullable%TYPE; Lv_Column_Default_Length DBA_TAB_COLUMNS.Default_Length%TYPE; Lv_Column_Data_Default DBA_TAB_COLUMNS.Data_Default%TYPE; Lv_Cons_Owner DBA_CONSTRAINTS.Owner%TYPE; Lv_Cons_Table_Name DBA_CONSTRAINTS.Table_Name%TYPE; Lv_Cons_Constraint_Name DBA_CONSTRAINTS.Constraint_Name%TYPE; Lv_Cons_Constraint_Type DBA_CONSTRAINTS.Constraint_Type%TYPE; Lv_Cons_Search_Cond DBA_CONSTRAINTS.Search_Condition%TYPE; Lv_Cons_Column_Name DBA_CONS_COLUMNS.Column_Name%TYPE; Lv_Cons_R_Constraint_Name DBA_CONSTRAINTS.R_Constraint_Name%TYPE; Lv_Cons_Ref_Owner DBA_CONSTRAINTS.Owner%TYPE; Lv_Cons_Ref_Table_Name DBA_CONSTRAINTS.Table_Name%TYPE; Lv_Cons_Ref_Column_Name DBA_CONS_COLUMNS.Column_Name%TYPE; Lv_Cons_Ref_Position DBA_CONS_COLUMNS.Position%TYPE; Lv_Cons_Exists VARCHAR2(1); Lv_String VARCHAR2(800); Lv_String2 VARCHAR2(800); Lv_Lineno NUMBER := 0; procedure WRITE_OUT(P_Line INTEGER, P_Owner VARCHAR2, P_Name VARCHAR2, P_String VARCHAR2) is begin insert into TAB_TEMP (Lineno, Id_Owner, Id_Name, Text) values (P_Line,P_Owner,P_Name,P_String);end;
procedure UPDATE_OUT(P_Line INTEGER, P_Owner VARCHAR2,
P_Name VARCHAR2, P_String VARCHAR2) is begin update TAB_TEMP set Text = P_String where Lineno = P_Line and Id_Owner = P_Owner and Id_Name = P_Name;
begin
open TAB_CURSOR;
loop
fetch TAB_CURSOR into Lv_Table_Owner, Lv_Table_Name, Lv_Tablespace_Name, Lv_Pct_Free, Lv_Pct_Used, Lv_Initial_Trans, Lv_Max_Trans, Lv_Initial_Extent, Lv_Next_Extent, Lv_Min_Extents, Lv_Max_Extents, Lv_Pct_Increase, Lv_Freelists, Lv_Freelist_Groups, Lv_Degree, Lv_Instances; exit when TAB_CURSOR%NOTFOUND; Lv_Lineno := 1; Lv_String:= 'CREATE TABLE ' || LOWER(Lv_Table_Owner) || '.' || LOWER(Lv_Table_Name); WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_string := '('; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; open COL_CURSOR (Lv_Table_Owner,Lv_Table_Name); loop fetch COL_CURSOR into Lv_Column_Name, Lv_Column_Data_Type, Lv_Column_Data_Length, Lv_Column_Data_Precision, Lv_Column_Data_Scale, Lv_Column_Nullable, Lv_Column_Default_Length, Lv_Column_Data_Default; exit when COL_CURSOR%NOTFOUND; Lv_String := ' ' || RPAD(LOWER(Lv_Column_Name),35) || Lv_Column_Data_Type; if ( (Lv_Column_Data_Type = 'VARCHAR2' ) or (Lv_Column_Data_Type = 'RAW' ) or (Lv_Column_Data_Type = 'CHAR' ) ) then Lv_String := Lv_String || '(' || Lv_Column_Data_Length || ')'; elsif (Lv_Column_Data_Type = 'NUMBER') then if Lv_Column_Data_Precision IS NULL then Lv_Column_Data_Precision := 38; Lv_Column_Data_Scale := 0; end if; Lv_String := Lv_String || '(' || Lv_Column_Data_Precision || ',' || Lv_Column_Data_Scale || ')'; end if; if (Lv_Column_Data_Default IS NOT NULL) then LV_String := Lv_String || ' DEFAULT ' || SUBSTR(Lv_Column_Data_Default, 1,Lv_Column_Default_Length); end if; if (Lv_Column_Nullable = 'N' ) then Lv_String := Lv_String || ' NOT NULL'; end if; Lv_String := Lv_String || ','; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; end loop; close COL_CURSOR; Lv_Lineno := Lv_Lineno - 1; Lv_String := SUBSTR(Lv_String,1,(LENGTH(Lv_String) - 1)); UPDATE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name,Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_String := ')'; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_String := 'PARALLEL ( DEGREE ' || Lv_Degree || ' INSTANCES ' || Lv_Instances || ' )'; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_String := 'TABLESPACE ' || Lv_Tablespace_Name ; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_String := 'PCTFREE ' || Lv_Pct_Free ; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_String := 'PCTUSED ' || Lv_Pct_Used ; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_String := 'INITRANS ' || Lv_Initial_Trans ; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_String := 'MAXTRANS ' || Lv_Max_Trans ; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_String := 'STORAGE'; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_String := '('; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_String := ' INITIAL ' || Lv_Initial_Extent ; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_String := ' NEXT ' || Lv_Next_Extent ; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_String := ' MINEXTENTS ' || Lv_Min_Extents ; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_String := ' MAXEXTENTS ' || Lv_Max_Extents ; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_String := ' PCTINCREASE ' || Lv_Pct_Increase ; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_String := ' FREELISTS ' || Lv_Freelists ; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_String := ' FREELIST GROUPS ' || Lv_Freelist_Groups ; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_String := ')'; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_String := '/'; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_Cons_Exists := 'N'; open CONS_CURSOR(Lv_Table_Owner, Lv_Table_Name); loop fetch CONS_CURSOR into Lv_Cons_Owner, Lv_Cons_Constraint_Name, Lv_Cons_Constraint_Type, Lv_Cons_Table_Name, Lv_Cons_Search_Cond, Lv_Cons_Column_Name, Lv_Cons_Ref_Position; exit when CONS_CURSOR%NOTFOUND; if (Lv_Cons_Constraint_Type = 'C') AND (INSTR(Lv_Cons_Search_Cond,'NOT NULL',1) = 0) then Lv_String := 'ALTER TABLE ' || Lv_Cons_Owner || '.' || Lv_Cons_Table_Name; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_String := 'ADD '; if (INSTR(Lv_Cons_Constraint_Name,'SYS_C',1) = 0) then Lv_String := Lv_String || 'CONSTRAINT ' || Lv_Cons_Constraint_Name; end if; Lv_String := Lv_String || ' CHECK (' || Lv_Cons_Search_Cond || ')'; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_String := '/'; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; end if; if (Lv_Cons_Constraint_Type = 'P') then Lv_Cons_Exists := 'Y'; if (Lv_Cons_Ref_Position = 1) then Lv_String := 'ALTER TABLE ' || Lv_Cons_Owner || '.' || Lv_Cons_Table_Name; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_String := 'ADD '; if (INSTR(Lv_Cons_Constraint_Name,'SYS_C') = 0) then Lv_String := Lv_String || 'CONSTRAINT ' || Lv_Cons_Constraint_Name || ' '; end if; Lv_String := Lv_String || 'PRIMARY KEY (' || Lv_Cons_Column_Name || ')'; else Lv_String := REPLACE(Lv_String,')',',' || Lv_Cons_Column_Name|| ')' ); end if; end if; end loop; if (Lv_Cons_Exists = 'Y') then WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_String := '/'; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; end if; close CONS_CURSOR; open REF_CURSOR(Lv_Table_Owner, Lv_Table_Name); loop fetch REF_CURSOR into Lv_Cons_Owner, Lv_Cons_Table_Name, Lv_Cons_Constraint_Name, Lv_Cons_R_Constraint_Name, Lv_Cons_Column_Name, Lv_Cons_Ref_Owner, Lv_Cons_Ref_Table_Name, Lv_Cons_Ref_Column_Name, Lv_Cons_Ref_Position; exit when REF_CURSOR%NOTFOUND; if (Lv_Cons_Ref_Position = 1) then Lv_String := 'ALTER TABLE '|| Lv_Table_Owner || '.' || Lv_Table_Name; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_String := 'ADD '; if (INSTR(Lv_Cons_Constraint_Name,'SYS_C',1) = 0) then Lv_String := Lv_String || 'CONSTRAINT ' || Lv_Cons_Constraint_Name || ' '; end if; Lv_String := Lv_String || 'FOREIGN KEY (' || Lv_Cons_Column_Name || ')'; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_String2 := ' REFERENCES ' || Lv_Cons_Ref_Owner || '.' || Lv_Cons_Ref_Table_Name || '(' || Lv_Cons_Ref_Column_Name || ')'; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String2); Lv_Lineno := Lv_Lineno + 1; WRITE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, '/'); Lv_Lineno := Lv_Lineno + 1; else Lv_String := REPLACE(Lv_String, ')', ',' || Lv_Cons_Column_Name || ')' ); Lv_Lineno := Lv_Lineno - 3; UPDATE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String); Lv_Lineno := Lv_Lineno + 1; Lv_String2 := REPLACE(Lv_String2, ')', ',' || Lv_Cons_Ref_Column_Name || ')' ); UPDATE_OUT(Lv_Lineno, Lv_Table_Owner, Lv_Table_Name, Lv_String2); Lv_Lineno := Lv_Lineno + 2; end if; end loop; close REF_CURSOR;
end loop;
close TAB_CURSOR;
end;
/
spool cre_tbl.sql
select Text
from TAB_TEMP
order by Id_Owner, Id_Name, Lineno
/
spool off
> With Oracle7, user_tables gives you the storage informations > (tablespace, cluster, pct_free, pct_used, int_trans, ...) > and user_tab_columns informations on the columns (name, type, ...). > > In Oracle8, you have to add the informations on partitions > with user_tab_partitions, user_ind_partitions, user_part_key_columns. > > If you want also constraints you have to watch to user_constraints, > user_cons_columns, user_indexes (for storage informations on the > indexes associated to the primary key, ...). > > If you want also indexes: user_indexes, user_ind_columns. > > ... (synonyms, privileges, cluster, ...) > > -- > Have a nice day > Michel > > Chroma <test_at_chromazone.demon.nl> a écrit dans le message : > 941540763.23203.0.pluto.d4ee2f03_at_news.demon.nl... > > Can anyone tell me, how to extract CREATE TABLE scripts for alluser tables
> > from the Oracle datadictionary views? > > > > Thanx, > > > > Martijn > > > > > >
Sent via Deja.com http://www.deja.com/
Before you buy.
Received on Tue Nov 02 1999 - 09:01:29 CST
![]() |
![]() |