Well, here is where I am so far. I believe I will have to turn off the pretty option to get the execute immediate to work. Sorry no comments, I learned before those were a thing, and never could get used to them. Note I haven't set up the logic to drop the interim table yet either. Regular disclaimer, test before you use, misuse could cause issues. procedure gen_ddl(owner in varchar2, table_name in varchar2, int_table_name in varchar2 :=null, tablespace_name in varchar2 :=null, ind_tablespace_name in varchar2:=null, new_tablespace in varchar2 :=null, new_ind_tablespace in varchar2 :=null, runcrt boolean :=false, runredef boolean :=true, drop_interim_table boolean :=false) as h number; th number; cmd_string varchar2(2000); ddl_text varchar2(32000); orig_string varchar2(500); new_string varchar2(500); int_tabname varchar2(30); int_tabcounter number :=0; start_redef varchar2(500); copy_dependents varchar2(500); finish_redef varchar2(500); redef_errors number(5):=0; opts_flag varchar2(200); nopts_flag number; ind_defined number :=0; begin dbms_output.enable(1000000); dbms_output.put_line(rtrim(owner)||'.'||rtrim(table_name)); h := dbms_metadata.open('TABLE'); dbms_metadata.set_filter(h,'SCHEMA',owner); dbms_metadata.set_filter(h,'NAME',table_name); th := dbms_metadata.add_transform(h,'MODIFY'); if new_tablespace is not null then dbms_metadata.set_remap_param(th,'REMAP_TABLESPACE',tablespace_name,new_tablespace); end if; if new_ind_tablespace is not null then dbms_metadata.set_remap_param(th,'REMAP_TABLESPACE',ind_tablespace_name,new_ind_tablespace); end if; if int_table_name is null then int_tabname:=table_name||'_INT'; else int_tabname:=int_table_name; end if; th := dbms_metadata.add_transform(h,'DDL'); dbms_metadata.set_transform_param(th,'STORAGE',false); dbms_metadata.set_transform_param(th,'PRETTY',true); dbms_metadata.set_transform_param(th,'SQLTERMINATOR',false); dbms_metadata.set_transform_param(th,'CONSTRAINTS',false); dbms_metadata.set_transform_param(th,'REF_CONSTRAINTS',false); orig_string:='CREATE TABLE "'||rtrim(owner)||'"'||'.'||'"'||rtrim(table_name)||'"'; new_string:='create table "'||owner||'"."'||int_tabname||'"'; select replace(replace(dbms_metadata.fetch_clob(h),orig_string,new_string),'CHAR','VARCHAR2') into ddl_text from dual; dbms_output.put_line(ddl_text); if runcrt=true then execute immediate ddl_text; if runredef=true then start_redef:='dbms_redefinition.start_redef_table(uname=>'||owner||',orig_table=>'||table_name||',int_table=>'||int_tabname||',options_flag=>'||opts_flag||')'; copy_dependents:='dbms_redefinition.copy_table_dependents(uname=>'||owner||',orig_table=>'||table_name||',int_table=>'||int_tabname||',num_errors=>redef_errors)'; finish_redef:='dbms_redefinition.finish_redef_table(uname=>'||owner||',orig_table=>'||table_name||',int_table=>'||int_tabname||')'; begin dbms_output.put_line(start_redef); dbms_redefinition.start_redef_table(uname=>owner,orig_table=>table_name,int_table=>int_tabname,options_flag=>nopts_flag); dbms_output.put_line(copy_dependents); dbms_redefinition.copy_table_dependents(uname=>owner,orig_table=>table_name,int_table=>int_tabname,num_errors=>redef_errors); dbms_output.put_line('Dependency Errors: '||to_char(redef_errors)); dbms_output.put_line(finish_redef); dbms_redefinition.finish_redef_table(uname=>owner,orig_table=>table_name,int_table=>int_tabname); exception when others then dbms_redefinition.abort_redef_table(uname=>owner,orig_table=>table_name,int_table=>int_tabname); raise; end; end if; end if; end; Sent from my iPad > On Mar 18, 2015, at 3:30 PM, Chris Taylor <christopherdtaylor1994@xxxxxxxxx> > wrote: > > Here's the one I used: > > Step 1: Get a list of OBJECTs you want metadata for: > > select 'select > dbms_metadata.get_ddl('''||object_type||''','''||object_name||''','''||owner||''') > txt from dual;'--object_type, object_name, owner > from dba_objects > where object_name in > (select object_name from test1) > and object_type not in ('SYNONYM') > and owner not in ('SYS','SYSTEM') > and object_type not like '%PARTITION%' > and owner not like '%..%' -- replace owners with whatever owners you want to > exclude > and owner not like '% .. %' -- replace owners with whatever owners you want > to exclude > order by object_name; > > Step 2: Paste Output from above into the > set pagesize 0 > set long 90000 > set lines 130 > column txt format a130 word_wrapped > set feedback off > --set longchunksize to 250 > set echo off > > spool c:\tmp\extract_ddl.sql > > begin > DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SEGMENT_ATTRIBUTES',true); > DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',false); > > DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'TABLESPACE',true); > > dbms_metadata.set_transform_param(dbms_metadata.session_transform,'PRETTY',true); > dbms_metadata.set_transform_param(dbms_metadata.session_transform,'SQLTERMINATOR',TRUE); > dbms_metadata.set_transform_param(dbms_metadata.session_transform,'CONSTRAINTS',FALSE); > dbms_metadata.set_transform_param(dbms_metadata.session_transform,'REF_CONSTRAINTS',FALSE); > dbms_metadata.set_transform_param(dbms_metadata.session_transform,'CONSTRAINTS_AS_ALTER',FALSE); > dbms_metadata.set_transform_param(dbms_metadata.session_transform,'SPECIFICATION',TRUE); > dbms_metadata.set_transform_param(dbms_metadata.session_transform,'BODY',TRUE); > end; > / > -- paste output from step 1 here and execute them > select dbms_metadata.get_ddl('TABLE','BS_APPLICATION','BS_ADMIN') txt from > dual; > > spool off > exit > >> On Wed, Mar 18, 2015 at 1:56 PM, Deas, Scott <Scott.Deas@xxxxxxx> wrote: >> Andrew, >> >> >> >> Below SQL will set some of the transform parameters to control your output, >> and then will replace double quotes with NULL, change CHAR to VARCHAR >> (protecting any existing VARCHAR), and will rename the table all at once >> (also pulls index ddl): >> >> >> >> BEGIN >> >> dbms_metadata.set_transform_param (dbms_metadata.session_transform, >> 'DEFAULT'); >> >> >> dbms_metadata.set_transform_param(dbms_metadata.session_transform,'PRETTY',TRUE); >> >> >> dbms_metadata.set_transform_param(dbms_metadata.session_transform,'CONSTRAINTS',FALSE); >> >> >> dbms_metadata.set_transform_param(dbms_metadata.session_transform,'CONSTRAINTS_AS_ALTER',TRUE); >> >> >> dbms_metadata.set_transform_param(dbms_metadata.session_transform,'SQLTERMINATOR',TRUE); >> >> >> dbms_metadata.set_transform_param(dbms_metadata.session_transform,'STORAGE',FALSE); >> >> END; >> >> / >> >> >> >> SELECT REPLACE(REPLACE(REPLACE(REPLACE(dbms_metadata.get_ddl('TABLE', >> table_name,owner),'VARCHAR','CHAR'),'CHAR','VARCHAR'),chr(34),NULL),table_name,table_name >> >> ||'_CPY') AS ddl_create >> >> FROM dba_tables >> >> WHERE TABLE_NAME = 'x' >> >> AND OWNER = 'y' >> >> UNION ALL >> >> SELECT REPLACE(REPLACE(REPLACE(dbms_metadata.get_ddl('INDEX', >> INDEX_NAME,OWNER),chr(34),NULL),index_name,index_name||'_CPY'),table_name,table_name||'_CPY') >> AS ddl_indexes >> >> FROM dba_INDEXES >> >> WHERE TABLE_NAME = 'x' and TABLE_OWNER = 'y' >> >> >> >> I’m sure there’s a better way to write this than having table_name and >> table_owner hard-coded twice. >> >> >> >> Thanks, >> >> Scott >> >> >> >> >> >> From: oracle-l-bounce@xxxxxxxxxxxxx [mailto:oracle-l-bounce@xxxxxxxxxxxxx] >> On Behalf Of Andrew Kerber >> Sent: Wednesday, March 18, 2015 2:38 PM >> To: Steve Harville >> Cc: Stefan Knecht; <oracle-l@xxxxxxxxxxxxx> >> Subject: Re: Dbms_metadata experts? >> >> >> >> Below is what I have so far. I would like to have a neater way of changing >> char to varchar2, and I would like to change the table names to >> tablename_int. >> >> >> >> select 'select >> replace(dbms_metadata.get_ddl(object_type=>'||''''||'TABLE'||''''||',name=>'||''''||table_name||''''||',schema=>'|| >> >> ''''||owner||''''||')'||'||'||''''||';'||''''|| >> >> ','||''''||'CHAR('||''''||','||''''||'varchar2('||''''||') from dual;' >> >> from dba_tables where owner='SCOTT'; >> >> >> Sent from my iPad >> >> >> >> Notice of Confidentiality: **This E-mail and any of its attachments may >> contain >> Lincoln National Corporation proprietary information, which is privileged, >> confidential, >> or subject to copyright belonging to the Lincoln National Corporation family >> of >> companies. This E-mail is intended solely for the use of the individual or >> entity to >> which it is addressed. If you are not the intended recipient of this E-mail, >> you are >> hereby notified that any dissemination, distribution, copying, or action >> taken in >> relation to the contents of and attachments to this E-mail is strictly >> prohibited >> and may be unlawful. If you have received this E-mail in error, please >> notify the >> sender immediately and permanently delete the original and any copy of this >> E-mail >> and any printout. Thank You.** >> >