2009-06-02 10 views
19

Ich habe eine Tabelle, die in einer Oracle-Datenbank existiert, aber nicht auf meiner Liste der Tabellen im Tool SQL Developer. Wenn ich jedoch zu SQL * Plus gehe und eineWie bekomme ich Oracle create table Anweisung in SQL * Plus

mache, bekomme ich die Tabelle aufgelistet. Wenn ich

desc snp_clearinghouse; 

eintippe, zeigt es mir die Felder an. Ich möchte die create-Anweisung erhalten, weil ich ein Feld hinzufügen muss. Ich kann die Tabelle ändern, um das Feld hinzuzufügen, aber ich brauche immer noch die create-Anweisung, die in unsere Quellcodeverwaltung eingefügt wird. Mit welcher pl/sql-Anweisung wird die create-Anweisung für eine Tabelle abgerufen?

+0

cletus Antwort wird Ihnen helfen, die DDL erhalten Sie wollen, aber in Bezug auf SQL Developer nicht die Tabelle zeigt, (Ich nehme an, Sie beziehen sich auf Oracle SQL Developer), melden Sie sich als Eigentümer der Tabelle an? Was passiert, wenn Sie in SQL Developer SELECT table_name FROM user_tables eingeben? –

+0

Es zeigt alle Tabellen, einschließlich dieser. Ich habe 84 Tabellen in dieser Datenbank, wenn ich einen SELECT-Tabellenname aus BenutzerTabellen und nur 83 in der Liste der Tabellen anzeigen. Dies ist eine relationale Datenbank, aber es ist eine Kopie einer heirachischen Datenbank, und sie wird jeden Tag neu generiert. Ich denke SQL Developer geht verloren oder kann nicht ganz mithalten. – thursdaysgeek

Antwort

27

Von 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

Wie oben, aber generische Skript hier gen_create_table_script.sql gefunden

-- ############################################################################################# 
-- 
-- %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

Danke für das Skript, es funktioniert super und macht genau das, was ich brauche! – DaveN59

+0

Hat sehr gut funktioniert. Vielen Dank. – KateYoak

+0

Warum DBMS_METADATA neu erstellen? –

Verwandte Themen