There are 2 scripts, I shall call them the calling script and the running script.
The calling script (which I called get_obj.sql) is as follows
doc Possible objects to get DDL for are :- CONSTRAINT DB_LINK DIRECTORY FUNCTION INDEX MATERIALIZED_VIEW MATERIALIZED_VIEW_LOG PACKAGE_SPEC PACKAGE_BODY PROCEDURE SEQUENCE SYNONYM TABLE TRIGGER TYPE_SPEC TYPE_BODY VIEW # accept Object prompt 'Enter Object type -> ' accept OwnerIN prompt "Enter Schema Owner (default %) -> " accept ObjNameIN prompt "Enter Object Name (default %) -> " set verify off set head off set feed off set pages 0 set trims on set term off set lines 200 col spool_on for a200 col select_clause for a200 col from_clause for a200 col where_clause for a200 col and_clause for a200 col object_clause for a200 col spool_off for a200 col object_type_dir new_value dir_and_type noprint col object_type_dirs new_value dir_and_types noprint col OwnerOUT new_value Owner noprint col ObjNameOUT new_value ObjName noprint select nvl('&OwnerIN','%') OwnerOUT , nvl('&ObjNameIN','%') ObjNameOUT from dual; SELECT CASE upper('&Object') WHEN 'MATERIALIZED_VIEW' THEN 'mview' WHEN 'MATERIALIZED_VIEW_LOG' THEN 'mview_log' WHEN 'PACKAGE_SPEC' THEN 'package' WHEN 'TYPE_SPEC' THEN 'type' ELSE lower('&Object') END object_type_dir FROM dual; SELECT CASE '&dir_and_type' WHEN 'index' THEN 'indexes' WHEN 'package_body' THEN 'package_bodies' WHEN 'type_body' THEN 'type_bodies' ELSE '&dir_and_type'||'s' END object_type_dirs FROM dual; spool get_sp_obj.sql SELECT 'spool do_get_sp_obj.sql' spool_on , q'[SELECT '@@get_ddl '||upper('&Object')||' '||]' || CASE '&Object' WHEN 'MATERIALIZED_VIEW_LOG' THEN q'[log_owner||' '||log_table||' '||log_owner||'/]'||'&dir_and_types'||q'[ '||master]' WHEN 'DB_LINK' THEN q'[owner||' '||db_link||' '||owner||'/]'||'&dir_and_types'||q'[/'||db_link]' WHEN 'FUNCTION' THEN q'[owner||' '||object_name||' '||owner||'/]'||'&dir_and_types'||q'[ '||object_name]' WHEN 'PROCEDURE' THEN q'[owner||' '||object_name||' '||owner||'/]'||'&dir_and_types'||q'[ '||object_name]' WHEN 'PACKAGE_SPEC' THEN q'[owner||' '||object_name||' '||owner||'/]'||'&dir_and_types'||q'[ '||object_name]' WHEN 'PACKAGE_BODY' THEN q'[owner||' '||object_name||' '||owner||'/]'||'&dir_and_types'||q'[ '||object_name]' WHEN 'SEQUENCE' THEN q'[sequence_owner||' '||sequence_name||' '||sequence_owner||'/]'||'&dir_and_types'||q'[ '||sequence_name]' WHEN 'TYPE_SPEC' THEN q'[owner||' '||type_name||' '||owner||'/]'||'&dir_and_types'||q'[ '||type_name]' WHEN 'TYPE_BODY' THEN q'[owner||' '||object_name||' '||owner||'/]'||'&dir_and_types'||q'[ '||object_name]' ELSE q'[owner||' '||]'||'&dir_and_type'||q'[_name||' '||owner||'/]'||'&dir_and_types'||q'[ '||]'||'&dir_and_type'||'_name' END select_clause , 'from ' || CASE '&Object' WHEN 'FUNCTION' THEN 'dba_objects' WHEN 'PROCEDURE' THEN 'dba_objects' WHEN 'PACKAGE_SPEC' THEN 'dba_objects' WHEN 'PACKAGE_BODY' THEN 'dba_objects' WHEN 'TYPE_SPEC' THEN 'dba_types' WHEN 'TYPE_BODY' THEN 'dba_objects' ELSE 'dba_'||'&dir_and_types' END from_clause , 'where ' || CASE '&Object' WHEN 'MATERIALIZED_VIEW_LOG' THEN 'log_owner' WHEN 'SEQUENCE' THEN 'sequence_owner' ELSE 'owner' END || q'[ like upper('&Owner')]' where_clause , 'and ' || CASE '&Object' WHEN 'FUNCTION' THEN q'[object_type = 'FUNCTION']' WHEN 'PROCEDURE' THEN q'[object_type = 'PROCEDURE']' WHEN 'PACKAGE_SPEC' THEN q'[object_type = 'PACKAGE']' WHEN 'PACKAGE_BODY' THEN q'[object_type = 'PACKAGE BODY']' WHEN 'TYPE_BODY' THEN q'[object_type = 'TYPE BODY']' ELSE '1 = 1' END and_clause , 'and ' || CASE '&Object' WHEN 'MATERIALIZED_VIEW_LOG' THEN q'[master like upper('&ObjName')]' WHEN 'DB_LINK' THEN q'[db_link like upper('&ObjName')]' WHEN 'FUNCTION' THEN q'[object_name like upper('&ObjName')]' WHEN 'PROCEDURE' THEN q'[object_name like upper('&ObjName')]' WHEN 'PACKAGE_SPEC' THEN q'[object_name like upper('&ObjName')]' WHEN 'PACKAGE_BODY' THEN q'[object_name like upper('&ObjName')]' WHEN 'TYPE_SPEC' THEN q'[type_name like upper('&ObjName')]' WHEN 'TYPE_BODY' THEN q'[object_name like upper('&ObjName')]' ELSE '&dir_and_type'||q'[_name like upper('&ObjName')]' END || ';' object_clause , 'spool off' spool_off FROM dual / spool off @@get_sp_obj.sql @@do_get_sp_obj.sql set verify on set head on set pages 60 set lines 140 set term on set feed 5
This script as you can see on line 72 calls the running script called get_ddl.sql
Here is get_ddl.sql
set lines 32767 set pages 0 set head off set feed off set trims on set verify off set term off set long 5000000 col text for a32767 !if [ ! -d &4 ]; then mkdir -p &4;fi spool &4/&5..sql select dbms_metadata.get_ddl('&1','&3','&2') text from dual / prompt / spool off
Load both of these scripts into the same directory and call the calling script from SQL*Plus.
For example
@get_obj
You will be prompted to input some object_types and possibly names and each object creation script will be spooled to its individual file in a directory structure that matches the object type.
For example all the table definitions will be in a directory named 'tables'.
These scripts can be handy if you need to do a lot of reconfiguring or simply wish to have a record of schema objects.
No comments:
Post a Comment