2009-06-02 55 views
19

Tengo una tabla que existe en una base de datos Oracle, pero no aparece en mi lista de tablas en la herramienta SQL Developer. Sin embargo, si voy a SQL * Plus, y hacer unCómo obtener Oracle create table statement en SQL * Plus

select table_name from user_tables; 

consigo la tabla que aparece. Si escribo

desc snp_clearinghouse; 

me muestra los campos. Me gustaría obtener la declaración de creación, porque necesito agregar un campo. Puedo modificar la tabla para agregar el campo, pero aún necesito la declaración de creación para ponerla en nuestro control de fuente. ¿Qué instrucción pl/sql se usa para obtener la instrucción create para una tabla?

+0

Cletus le ayudará a obtener el DDL que desee, pero en lo que respecta a SQL Developer no mostrar la tabla (Supongo que te estás refiriendo a Oracle SQL Developer), ¿estás iniciando sesión como propietario de la tabla? ¿Qué sucede si escribe SELECT table_name FROM user_tables en SQL Developer? –

+0

Muestra todas las tablas, incluida esa. Tengo 84 tablas en esta base de datos, cuando selecciono table_name de user_tables, y solo 83 aparecen en la lista de tablas. Esta es una base de datos relacional, pero es una copia de una base de datos heirarachical y se regenera todos los días. Creo que SQL Developer se pierde, o no puede mantener el ritmo a veces. – thursdaysgeek

Respuesta

27

De 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

Igual que el anterior, pero la escritura genérica encontrar aquí 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; 
/
respuesta
+0

¡Gracias por el guión, funciona muy bien y hace exactamente lo que necesito! – DaveN59

+0

Funcionó muy bien. Gracias. – KateYoak

+0

¿Por qué recrear DBMS_METADATA? –

Cuestiones relacionadas