2009-06-02 19 views
19

Oracleデータベースに存在するが、ツールSQL Developerのテーブルのリストには表示されないテーブルがあります。ただし、SQL * Plusにアクセスして実行すると、SQL * PlusでOracle create table文を取得する方法

select table_name from user_tables; 

が表示されます。私が入力した場合

desc snp_clearinghouse; 

私にフィールドが表示されます。フィールドを追加する必要があるので、私はcreateステートメントを取得したいと思います。フィールドを追加するためにテーブルを変更することはできますが、ソースコントロールに入れるにはcreateステートメントが必要です。どのようなpl/sqlステートメントがテーブルのcreateステートメントを取得するために使用されますか?

+0

cletusの答えはあなたが欲しいDDLを得るのを助けるが、SQLの開発に関してテーブルを示すません(私はあなたがOracle SQL Developerを参照していると仮定します)、テーブルの所有者としてログインしていますか? SQL DeveloperでSELECT table_name FROM user_tablesと入力するとどうなりますか? –

+0

それは、それを含むすべてのテーブルを表示します。私はこのデータベースに84テーブルを持っています。私はuser_tablesからselect table_nameを実行し、テーブルのリストには83テーブルしか表示しません。 これはリレーショナルデータベースですが、heirarachicalデータベースのコピーであり、毎日再生されます。私はSQL Developerが紛失したり、時にはうまくいかないと思っています。 – thursdaysgeek

答えて

27

Get table and index DDL the easy wayから:ここで見つける

set heading off; 
set echo off; 
Set pages 999; 
set long 90000; 

spool ddl_list.sql 

select dbms_metadata.get_ddl('TABLE','DEPT','SCOTT') from dual; 

select dbms_metadata.get_ddl('INDEX','DEPT_IDX','SCOTT') from dual; 

spool off; 
5
上記と同じ

が、汎用スクリプトgen_create_table_script.sql

-- ############################################################################################# 
-- 
-- %Purpose: Generate 'CREATE TABLE' Script for an existing Table in the database 
-- 
-- Use:  SYSTEM, SYS or user having SELECT ANY TABLE system privilege 
-- 
-- ############################################################################################# 
-- 
set serveroutput on size 200000 
set echo off 
set feedback off 
set verify off 
set showmode off 
-- 
ACCEPT l_user CHAR PROMPT 'Username: ' 
ACCEPT l_table CHAR PROMPT 'Tablename: ' 
-- 
DECLARE 
CURSOR TabCur IS 
SELECT table_name,owner,tablespace_name, 
     initial_extent,next_extent, 
     pct_used,pct_free,pct_increase,degree 
    FROM sys.dba_tables 
    WHERE owner=upper('&&l_user') 
    AND table_name=UPPER('&&l_table'); 
-- 
CURSOR ColCur(TableName varchar2) IS 
SELECT column_name col1, 
     DECODE (data_type, 
       'LONG',  'LONG ', 
       'LONG RAW', 'LONG RAW ', 
       'RAW',  'RAW ', 
       'DATE',  'DATE ', 
       'CHAR',  'CHAR' || '(' || data_length || ') ', 
       'VARCHAR2', 'VARCHAR2' || '(' || data_length || ') ', 
       'NUMBER',  'NUMBER' || 
       DECODE (NVL(data_precision,0),0, ' ',' (' || data_precision || 
       DECODE (NVL(data_scale, 0),0, ') ',',' || DATA_SCALE || ') '))) || 
     DECODE (NULLABLE,'N', 'NOT NULL',' ') col2 
    FROM sys.dba_tab_columns 
    WHERE table_name=TableName 
    AND owner=UPPER('&&l_user') 
ORDER BY column_id; 
-- 
ColCount NUMBER(5); 
MaxCol  NUMBER(5); 
FillSpace NUMBER(5); 
ColLen  NUMBER(5); 
-- 
BEGIN 
MaxCol:=0; 
-- 
FOR TabRec in TabCur LOOP 
    SELECT MAX(column_id) INTO MaxCol FROM sys.dba_tab_columns 
    WHERE table_name=TabRec.table_name 
     AND owner=TabRec.owner; 
    -- 
    dbms_output.put_line('CREATE TABLE '||TabRec.table_name); 
    dbms_output.put_line('('); 
    -- 
    ColCount:=0; 
    FOR ColRec in ColCur(TabRec.table_name) LOOP 
     ColLen:=length(ColRec.col1); 
     FillSpace:=40 - ColLen; 
     dbms_output.put(ColRec.col1); 
     -- 
     FOR i in 1..FillSpace LOOP 
     dbms_output.put(' '); 
     END LOOP; 
     -- 
     dbms_output.put(ColRec.col2); 
     ColCount:=ColCount+1; 
     -- 
     IF (ColCount < MaxCol) THEN 
     dbms_output.put_line(','); 
     ELSE 
     dbms_output.put_line(')'); 
     END IF; 
    END LOOP; 
    -- 
    dbms_output.put_line('TABLESPACE '||TabRec.tablespace_name); 
    dbms_output.put_line('PCTFREE '||TabRec.pct_free); 
    dbms_output.put_line('PCTUSED '||TabRec.pct_used); 
    dbms_output.put_line('STORAGE ('); 
    dbms_output.put_line(' INITIAL  '||TabRec.initial_extent); 
    dbms_output.put_line(' NEXT  '||TabRec.next_extent); 
    dbms_output.put_line(' PCTINCREASE '||TabRec.pct_increase); 
    dbms_output.put_line(')'); 
    dbms_output.put_line('PARALLEL '||TabRec.degree); 
    dbms_output.put_line('/'); 
END LOOP; 
END; 
/
+0

スクリプトのおかげで、それは素晴らしい作品と私​​は必要なものを正確に行います! – DaveN59

+0

非常にうまくいった。ありがとうございました。 – KateYoak

+0

なぜDBMS_METADATAを再作成しますか? –

関連する問題