2009-06-02 26 views
19

'da tablo tablosu oluşturma nasıl kullanılır Bir Oracle veritabanında bulunan bir tablo var, ancak SQL Developer aracındaki tablo listemde görünmüyor. Ancak, SQL * Plus'a gidersem veOracle, SQL * Plus

Tablo listelenirse, listelenirim.

yazıyorsa, alanları gösterir. Oluşturma ifadesini almak istiyorum, çünkü bir alan eklemem gerekiyor. Alanı ekleyebilmek için tabloyu değiştirebilirim, ancak kaynak kontrolümüze devam etmek için hala oluşturma ifadesine ihtiyacım var. Bir tablo için create ifadesini almak için hangi pl/sql ifadesi kullanılır? Get table and index DDL the easy way itibaren

+0

Cletus'un cevabı (Oracle SQL Developer'a başvurduğunuzu varsayalım), masanın sahibi olarak giriş yapıyor musunuz? SQL Developer'da SELECT table_name FROM user_tables yazarsanız ne olur? –

+0

Bu da dahil olmak üzere tüm tabloları gösterir. Bu veritabanında, user_tables öğesinden select table_name yaptığımda ve tablo listesinde yalnızca 83 gösteri yaptığımda 84 tablo var. Bu ilişkisel bir veritabanıdır, ancak bir hiyerarşik veritabanının bir kopyasıdır ve her gün yeniden oluşturulur. Bence SQL Developer kayboluyor ya da bazen ayak uyduramaz. – thursdaysgeek

cevap

27

: Yukarıdaki ama jenerik senaryo burada gen_create_table_script.sql bulduğumuz gibi

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

aynı

-- ############################################################################################# 
-- 
-- %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; 
/
istediğiniz DDL olsun, ama SQL Geliştirici açısından tabloyu görünmüyor yardımcı olacaktır
+0

Komut dosyası için teşekkürler, harika çalışıyor ve tam ihtiyacım olanı yapıyor! – DaveN59

+0

Çok iyi çalıştı. Teşekkür ederim. – KateYoak

+0

Neden DBMS_METADATA'yı yeniden oluşturuyorsunuz? –