代码之家  ›  专栏  ›  技术社区  ›  thursdaysgeek

如何在SQL*Plus中获取Oracle create table语句

  •  19
  • thursdaysgeek  · 技术社区  · 16 年前

    我有一个表存在于Oracle数据库中,但没有显示在工具SQL Developer中的表列表中。但是,如果我转到SQL*Plus,并执行

    select table_name from user_tables;
    

    我把桌子列出来了。如果我打字

    desc snp_clearinghouse;
    

    它向我展示了田野。我想得到create语句,因为我需要添加一个字段。我可以修改表以添加字段,但我仍然需要create语句放入源代码管理中。哪个pl/sql语句用于获取表的create语句?

    2 回复  |  直到 16 年前
        1
  •  32
  •   cletus    16 年前

    从…起 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;
    
        2
  •  5
  •   Tasos K. Sagar Jaybhay    9 年前

    与上面相同,但此处找到了通用脚本 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;
    /