Script to create a data dictionary listing which combines the Oracle dictionary with the Oracle Apps dictionary

--
--  Creates a data dictionary listing which combines the Oracle dic with
--  the Apps dic.  So you get the helpful comments and foreign key help
--  if it's available and you still get the basics even when Apps has
--  nothing on it.
--
--  Views are not included.  Tables are not shown if they contain no rows.
--
--  23oct98  Created.  Tested against Apps 10.7SC on Oracle 7.3
--  17nov98  Added accurate rowcounts for small tables, rather than relying
--           on the stats.
--
--
 

set head off
set pages 0
set lines 2000
set echo off
set serverout on
set termout on
set feed on
drop table nic_temp_text
/
create table nic_temp_text (seq number, text varchar2(2000))
/

declare
 i         number;
 pkey      varchar2(9);
 fkey      varchar2(99);
 col_desc  varchar2(2000);
 line      varchar2(2000);
 tab       varchar2(99);
 col       varchar2(99);
 in_apps   char(1);
 tab_id    number;
 app_id    number;
 col_id    number;
 row_count number;
 x_cursor  number;
 x_n       number;
 x_sql     varchar2(2000);
 --
 --  The tab_col cursor is the place to restrict things if you just want a
 --  few tables, or just want the tables for a single module:
 --
 cursor tab_col is
   select t.owner,
          t.table_name,
          t.num_rows,
          c.column_name,
          decode(c.nullable,'N','NN','') nul,
          c.data_type||decode(c.data_type,
                           'NUMBER',
 decode(c.data_precision,null,'','('||to_char(c.data_precision)||','||to_char(c.data_scale)||')'), 'DATE','',  'LONG','',  'LONG RAW','','('||to_char(c.data_length)||')') datatype
     from all_tables t, all_tab_columns c
     where t.owner = c.owner
       and c.table_name = t.table_name
     order by t.table_name, c.column_id;
 --
 cursor app_tab is
   select ft.table_id,
          ft.application_id,
          fa.application_name||':  '||ft.description txt
     from fnd_tables ft, fnd_application fa
     where ft.application_id = fa.application_id
       and ft.table_name = tab;
 --
 cursor app_col is
   select column_id,
          description
     from fnd_columns
     where column_name = col
       and table_id = tab_id
       and application_id = app_id;
 --
 cursor pk is
   select decode(max(primary_key_id), null,'', min(primary_key_id),' PK','*PK') txt
     from fnd_primary_key_columns
     where application_id = app_id
       and table_id = tab_id
       and column_id = col_id;
 --
 cursor fk is
   select pt.table_name||'.'||pc.column_name txt
     from fnd_foreign_key_columns fkc, fnd_foreign_keys fk,
          fnd_primary_key_columns pk, fnd_columns pc, fnd_tables pt
     where fkc.table_id = tab_id
       and fkc.application_id = app_id
       and fkc.column_id = col_id
       and fk.table_id = tab_id
       and fk.application_id = app_id
       and fk.foreign_key_id = fkc.foreign_key_id
       and pk.table_id = fk.primary_key_table_id
       and pk.application_id = fk.primary_key_application_id
       and pk.primary_key_sequence = fkc.foreign_key_sequence
       and pk.primary_key_id = fk.primary_key_id
       and pc.table_id = pk.table_id
       and pc.application_id = pk.application_id
       and pc.column_id = pk.column_id
       and pt.table_id = pk.table_id
       and pt.application_id = pk.application_id;
 --
 begin
 --
 i := 1;
 tab := 'ZZZ';
 --
 dbms_output.enable(999999);
 dbms_output.put_line('Start build '||to_char(sysdate,'DD MON YY HH24:MI'));
 --
 x_cursor := dbms_sql.open_cursor;
 --
 for x in tab_col loop
 begin
   if x.table_name = tab then
     null;
   else
   begin
 --
     tab := x.table_name;
     row_count := nvl(x.num_rows, 0);
 --
     if row_count < 10 then
       begin
         x_sql := 'SELECT COUNT(*) FROM '|| tab;
         dbms_sql.parse(x_cursor, x_sql, dbms_sql.v7);
         dbms_sql.define_column(x_cursor, 1, row_count);
         x_n := dbms_sql.execute(x_cursor);
         x_n := dbms_sql.fetch_rows(x_cursor);
         if x_n > 0 then
           dbms_sql.column_value(x_cursor, 1, row_count);
  else
           dbms_output.put_line('WARNING no count on '||tab);
    row_count := 0;
         end if;
       exception
         when others then
           dbms_output.put_line('ERROR getting count on '||tab||' '||sqlerrm);
       end;
       row_count := nvl(row_count, 0);
     end if;
 --
 --  To include empty tables, force this condition to true (and another one below):
 --
     if row_count > 0 then
       insert into nic_temp_text (seq, text)
         values (i, ' ');
       i := i + 1;
       insert into nic_temp_text (seq, text)
         values (i, ' ');
       i := i + 1;
       insert into nic_temp_text (seq, text)
         values (i, tab);
       i := i + 1;
 --
       open app_tab;
       fetch app_tab into tab_id, app_id, line;
       if app_tab%found then
         in_apps := 'Y';
         insert into nic_temp_text (seq, text)
           values (i, '  '||x.owner||' ('||to_char(row_count)||')'||' '||line);
         i := i + 1;
       else
         in_apps := 'N';
         insert into nic_temp_text (seq, text)
           values (i, '  '||x.owner||' ('||to_char(row_count)||')');
         i := i + 1;
       end if;
       close app_tab;
 --
       insert into nic_temp_text (seq, text)
         values (i, ' ');
       i := i + 1;
 --
       commit;
     end if;
 --
   end;
   end if;
 --
 --  To include empty tables, force this condition to true (and another one above):
 --
   if row_count > 0 then
     line := ' '||rpad(x.column_name, 31)||rpad(x.datatype, 17)||x.nul;
     col := x.column_name;
 --
     if in_apps = 'Y' then
       open app_col;
       fetch app_col into col_id, col_desc;
       if app_col%found then
 --
         open pk;
         fetch pk into pkey;
         if pk%found then
           line := rpad(line, 52)||pkey;
         end if;
         close pk;
 --
         open fk;
         fetch fk into fkey;
         if fk%found then
           line := rpad(line, 56)||fkey;
 --
           fetch fk into fkey;
           while fk%found loop
             line := line||'  '||fkey;
             fetch fk into fkey;
           end loop;
 --
           line := line||'  '||col_desc;
         else
           line := rpad(line, 58)||col_desc;
         end if;
         close fk;
 --
       end if;
       close app_col;
     end if;
 --
     insert into nic_temp_text (seq, text)
       values (i, line);
     i := i + 1;
 --
     commit;
   end if;
 exception
   when others then
     dbms_output.put_line('ERROR '||x.table_name||' '||x.column_name||' '||sqlerrm);
 end;
 end loop;
 --
 commit;
 dbms_sql.close_cursor(x_cursor);
 dbms_output.put_line('Build done '||to_char(sysdate,'DD MON YY HH24:MI'));
 end;
/
 set trimspool on
 set termout off
 set feed off
 spool apps_tables.txt
 select text
   from nic_temp_text
   order by seq
/
 spool off
 set termout on
 set feed on
 drop table nic_temp_text
/

Have a Oracle Question
Do you have an Oracle Question?

Oracle Books
Oracle Certification, Database Administration, SQL, Application, Programming Reference Books

Oracle Application
Oracle Application Hints and Tips

Oracle Home
Oracle Database, SQL, Application, Programming Tips

All the site contents are Copyright © www.erpgreat.com and the content authors. All rights reserved.
All product names are trademarks of their respective companies.
The site www.erpgreat.com is not affiliated with or endorsed by any company listed at this site.
Every effort is made to ensure the content integrity.  Information used on this site is at your own risk.
 The content on this site may not be reproduced or redistributed without the express written permission of
www.erpgreat.com or the content authors.