2009-06-02 13 views
19

Mam tabelę, która istnieje w bazie danych Oracle, ale nie wyświetla na mojej liście tabel w narzędziu SQL Developer. Jednakże, jeśli przejdę do SQL * Plus i wykonuję otrzymam tabelę na liście. Jeśli podamJak uzyskać Oracle utworzyć instrukcję tabeli w SQL * Plus

desc snp_clearinghouse; 

to pokaże mi pola. Chciałbym uzyskać instrukcję create, ponieważ muszę dodać pole. Mogę zmodyfikować tabelę, aby dodać pole, ale nadal potrzebuję instrukcji create, aby wprowadzić ją do naszej kontroli źródła. Jaka instrukcja pl/sql jest używana do uzyskania instrukcji create dla tabeli?

+0

Cletus pomoże Ci uzyskać DDL chcesz, ale w odniesieniu do SQL Developer nie pokazuje tabela (Zakładam, że odnosisz się do Oracle SQL Developer), czy logujesz się jako właściciel tabeli? Co się stanie, jeśli wpiszesz SELECT nazwa_tabeli FROM user_tables w SQL Developer? –

+0

Pokazuje wszystkie tabele, w tym także tę. Mam 84 tabele w tej bazie danych, gdy wybieram select table_name z user_tables, a tylko 83 show na liście tabel. Jest to relacyjna baza danych, ale jest to kopia bazy danych heirarachical, która jest regenerowana każdego dnia. Wydaje mi się, że programista SQL gubi się lub czasami nie może nadążyć. – thursdaysgeek

Odpowiedz

27

Od 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

jw ale generic skrypt znaleźć tutaj 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; 
/
odpowiedź
+0

Dzięki za skrypt, działa świetnie i robi dokładnie to, czego potrzebuję! – DaveN59

+0

Działa bardzo dobrze. Dziękuję Ci. – KateYoak

+0

Po co odtwarzać DBMS_METADATA? –

Powiązane problemy