2009-06-02 3 views
19

У меня есть таблица, которая существует в базе данных Oracle, но не отображается в моем списке таблиц в инструменте SQL Developer. Однако, если я перейду к SQL * Plus и сделаюКак заставить Oracle создать инструкцию таблицы в SQL * Plus

select table_name from user_tables; 

Я получаю таблицу в списке. Если я напечатаю

desc snp_clearinghouse; 

это показывает мне поля. Я хотел бы получить инструкцию create, потому что мне нужно добавить поле. Я могу изменить таблицу, чтобы добавить это поле, но мне все еще нужен оператор create для ввода в наш исходный элемент управления. Какой оператор pl/sql используется для получения инструкции create для таблицы?

+0

Клетуса поможет вам получить DDL вы хотите, но в отношении SQL Developer не показывает таблицу (Я полагаю, вы имеете в виду Oracle SQL Developer), вы регистрируетесь как владелец таблицы? Что произойдет, если вы наберете SELECT table_name FROM user_tables в SQL Developer? –

+0

Он показывает все таблицы, в том числе и тот. У меня 84 таблицы в этой базе данных, когда я выбираю table_name из user_tables, и только 83 отображаются в списке таблиц. Это реляционная база данных, но это копия базы данных heirarachical, и каждый день она восстанавливается. Я думаю, что разработчик SQL теряется или иногда не может устоять. – thursdaysgeek

ответ

27

От 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

То же, что и выше, но общий сценарий здесь 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; 
/
ответ
+0

Спасибо за скрипт, он отлично работает и делает именно то, что мне нужно! – DaveN59

+0

Работал очень хорошо. Спасибо. – KateYoak

+0

Зачем воссоздать DBMS_METADATA? –

Смежные вопросы