2009-06-02 10 views
19

Ho una tabella che esiste in un database Oracle, ma non viene visualizzata nel mio elenco di tabelle nello strumento SQL Developer. Tuttavia, se vado a SQL * Plus, e faccio unCome ottenere l'istruzione della tabella Oracle in SQL * Plus

select table_name from user_tables; 

Ricevo la tabella elencata. Se digito

desc snp_clearinghouse; 

mi mostra i campi. Mi piacerebbe ottenere la dichiarazione di creazione, perché ho bisogno di aggiungere un campo. Posso modificare la tabella per aggiungere il campo, ma ho ancora bisogno della dichiarazione di creazione da inserire nel nostro controllo del codice sorgente. Quale istruzione pl/sql viene utilizzata per ottenere l'istruzione create per una tabella?

+0

di Cletus vi aiuterà a ottenere il DDL che volete, ma per quanto riguarda SQL Developer non mostra la tabella (Presumo che tu ti stia riferendo a Oracle SQL Developer), stai effettuando il login come proprietario del tavolo? Cosa succede se si digita SELECT nome_ta FROM tabelle_utente in SQL Developer? –

+0

Mostra tutte le tabelle, inclusa quella. Ho 84 tabelle in questo database, quando faccio un select table_name da user_tables, e solo 83 mostrano nella lista delle tabelle. Questo è un database relazionale, ma è una copia di un database heirarachical e viene rigenerato ogni giorno. Penso che lo sviluppatore di SQL si perda, o non possa mantenere abbastanza a volte. – thursdaysgeek

risposta

27

Da 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

Idem come sopra, ma script generico trovato qui 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; 
/
risposta
+0

Grazie per la sceneggiatura, funziona alla grande e fa esattamente quello di cui ho bisogno! – DaveN59

+0

Ha funzionato molto bene. Grazie. – KateYoak

+0

Perché ricreare DBMS_METADATA? –