不想用pl/sql developer, toad等第三方工具, 要命令的形式。
谢谢大家了。

解决方案 »

  1.   

    可以使用dbms包,其中有一个获得对象DDL语句的函数,
    dbms_metadata.get_ddl(object_type,object_name,object_owner)。
    其中object_type:表示要获得 ddl 语句对象的类型,如:table,index 等
        object_name:表示要获得 ddl 语句对象的名称
        object_owner:表示要获得 ddl 语句对象的所有者
      

  2.   

    Oracle8i中生成创建对象的SQL REM 
    REM        author: 朱伟民, time:15:20 01-8-4 
    REM        版权 :sinosoft 
    REM        version:1.0 
    REM        从 oracle8i Enterprise Edition 数据库生成创建对象的脚本文件 
    REM -- 
    -- 包头定义 
    -- 
    CREATE OR REPLACE PACKAGE srcmake AS 
     PROCEDURE maktab; 
     PROCEDURE makview; 
     PROCEDURE makseq; 
     PROCEDURE makcon(tabName VARCHAR2); 
    END srcmake; 
    / -- 
    -- 包体定义 
    -- 
    CREATE OR REPLACE PACKAGE BODY srcmake AS 
    -- 
    -- 处理超过255个字符的行的输出 
    -- 
    PROCEDURE dealline(initStr VARCHAR2) IS 
     lineCount INTEGER; 
     i INTEGER; 
    BEGIN 
     lineCount := ceil(length(initStr)/255); 
     FOR i IN 1..lineCount LOOP 
       dbms_output.put_line(substr(initStr,1 + 255 * (i - 1),255)); 
     END LOOP; 
    END dealline; -- 
    -- 生成创建表的SQL文件 
    -- 
    PROCEDURE maktab IS 
     tempStr varchar2(4000); 
     countNum integer; 
     i integer; 
    BEGIN 
     dbms_output.enable(9E38);  -- 输出sql文件说明信息 
     dbms_output.put_line('REM create table''s sql'); 
     dbms_output.put_line('REM database user name:'||user); 
     dbms_output.put_line('REM outputTime:'||sysdate);  -- 查询用户的所有的表 
     FOR curtab IN( 
            SELECT a.table_name table_name,a.tablespace_name,b.comments comments 
            FROM user_tables A,user_tab_comments b 
            WHERE a.table_name = b.table_name AND b.table_type = 'TABLE' 
            ORDER BY a.table_name) 
     LOOP 
       -- 输出表信息 
       dbms_output.put_line(chr(10)||'DROP TABLE '||curtab.table_name||';'); 
       dbms_output.put_line('-- 表名:'||curtab.table_name); 
       dbms_output.put_line('-- 备注:'||curtab.comments); 
       dbms_output.put_line('CREATE TABLE '||curtab.table_name||'(');    SELECT count(column_name) INTO countNum FROM user_tab_columns 
            WHERE table_name = curtab.table_name; 
       i := 0;    -- 查询表所有的列 
       FOR curcol IN( 
            SELECT a.*,b.comments 
            FROM user_tab_columns a,user_col_comments b 
            WHERE a.table_name = curtab.table_name AND a.table_name = b.table_name 
            AND a.column_name = b.column_name ORDER BY column_id) 
       LOOP 
         tempStr := chr(9)||rpad(curcol.column_name,31,' ')||curcol.data_type;      -- 以下类型需要指定长度 
         IF curcol.data_type IN('VARCHAR2','CHAR','VARCHAR','RAW') THEN 
           tempStr := tempStr||'('||curcol.data_length||')';      -- 数字类型存在精度问题 
         ELSIF curcol.data_type = 'NUMBER' THEN 
           IF curcol.data_precision IS NOT NULL THEN 
             tempStr := tempStr||'('||curcol.data_precision; 
             IF curcol.data_scale IS NOT NULL THEN 
               tempStr := tempStr||','||curcol.data_scale||')'; 
             ELSE 
               tempStr := tempStr||')'; 
             END IF; 
           ELSIF curcol.data_scale = 0 THEN 
                tempStr := tempStr||'(38)'; 
           END IF; 
         END IF; 
         -- LONG,LONG RAW,CLOB,NLOB,BLOB,ROWID类型不需指定长度      IF curcol.nullable = 'N' THEN        -- 指定非空标志 
           tempStr := tempStr||' NOT NULL'; 
         END IF; 
         i := i + 1;      -- 最后一列不需逗号 
         IF i != countNum THEN 
           tempStr := tempStr||','; 
         END IF;      -- 输出列的信息 
         IF curcol.comments IS NOT NULL THEN 
           dbms_output.put_line(rpad(tempStr,60,' ')||'-- '||curcol.comments); 
         ELSE 
           dbms_output.put_line(tempStr); 
         END IF; 
       END LOOP;    -- 输出表空间信息 
       dbms_output.put_line(') TABLESPACE '||curtab.tablespace_name||';');    -- 输出表约束 
       makcon(curtab.table_name); 
     END LOOP; 
     dbms_output.put_line(chr(10)||chr(10)); 
    END maktab; -- 
    -- 生成表的约束(primary key,foreign key) 
    -- parameter:tabName表名称 
    PROCEDURE makcon(tabName VARCHAR2) IS 
     tempStr VARCHAR2(4000); 
     tempColStr VARCHAR2(2000); 
    BEGIN 
     FOR curcon IN( 
            SELECT owner,constraint_name name,constraint_type type, 
            r_constraint_name rname,delete_rule,r_owner,table_name 
            FROM user_constraints WHERE table_name = tabName AND constraint_type IN('P','R','U')) 
     LOOP 
       -- 输出约束信息 
       tempStr := 'ALTER TABLE '||tabName||' ADD CONSTRAINTS '||curcon.name;    FOR curcol IN(SELECT column_name FROM user_cons_columns 
            WHERE constraint_name = curcon.name) LOOP 
         tempColStr := tempColStr||curcol.column_name||','; 
       END LOOP; 
       tempColStr := substr(tempColStr,0,length(tempColStr) - 1);    -- 输出约束的列信息 
       IF curcon.type = 'P' THEN -- 主键 
         tempStr := tempStr||' PRIMARY KEY('||tempColStr||');'; 
       ELSIF curcon.type = 'R' THEN -- 外键 
         tempStr := tempStr||' FOREIGN KEY('||tempColStr||') '||chr(10); 
         tempStr := tempStr||'   REFERENCES '||curcon.r_owner||'.'||curcon.table_name||'('||tempColStr||') '; 
         tempStr := tempStr||curcon.delete_rule||';'; 
       ELSIF curcon.type = 'U' THEN -- 唯一约束 
         tempStr := tempStr||' UNIQUE('||tempColStr||');'; 
       END IF; 
       dbms_output.put_line(tempStr); 
     END LOOP; 
    END makcon; -- 
    -- 生成创建视图的SQL文件 
    -- 
    PROCEDURE makview IS 
     i INTEGER; 
    BEGIN 
     dbms_output.enable(9E38); 
     -- 输出sql文件说明信息 
     dbms_output.put_line(chr(10)||chr(10)||'REM create view''s sql'); 
     dbms_output.put_line('REM database user name:'||user); 
     dbms_output.put_line('REM outputTime:'||sysdate);  -- 查询用户的所有的表 
     FOR curview IN( 
            SELECT a.view_name,a.text,b.comments comments 
            FROM user_views A,user_tab_comments b 
            WHERE a.view_name = b.table_name AND b.table_type = 'VIEW' 
            ORDER BY a.view_name) 
     LOOP 
       -- 输出表信息 
       dbms_output.put_line(chr(10)||'DROP VIEW '||curview.view_name||';'); 
       dbms_output.put_line('-- 视图名:'||curview.view_name); 
       dbms_output.put_line('-- 备注:'||curview.comments); 
       dbms_output.put_line('CREATE VIEW '||curview.view_name||' AS '); 
       dealline(curview.text||';'); 
     END LOOP; 
     dbms_output.put_line(chr(10)||chr(10)); 
    END makview; -- 
    -- 生成创建序列的SQL文件 
    -- 
    PROCEDURE makseq IS 
     tempStr VARCHAR2(4000); 
    BEGIN 
     dbms_output.enable(9E38); 
     -- 输出sql文件说明信息 
     dbms_output.put_line('REM create sequence''s sql'); 
     dbms_output.put_line('REM database user name:'||user); 
     dbms_output.put_line('REM outputTime:'||sysdate);  -- 查询用户的所有的表 
     FOR curseq IN(select * from seq) LOOP 
       dbms_output.put_line('DROP SEQUENCE '||curseq.sequence_name||';'); 
       tempStr := 'CREATE SEQUENCE '||curseq.sequence_name; 
       IF curseq.min_value IS NULL THEN 
         tempStr := tempStr||' NOMINVALUE '; 
       ELSE 
         tempStr := tempStr||' MINVALUE '||curseq.min_value; 
       END IF; 
       IF curseq.max_value IS NULL THEN 
         tempStr := tempStr||' NOMAXVALUE '; 
       ELSE 
         tempStr := tempStr||' MAXVALUE '||curseq.max_value; 
       END IF; 
       tempStr := tempStr||' INCREMENT_BY '||curseq.increment_by; 
       tempStr := tempStr||' STRART_WITH '||curseq.last_number; 
       IF curseq.cycle_flag = 'Y' THEN 
         tempStr := tempStr||' CYCLE '; 
       ELSE 
         tempStr := tempStr||' NOCYCLE '; 
       END IF; 
       IF curseq.order_flag = 'Y' THEN 
         tempStr := tempStr||' ORDER '; 
       ELSE 
         tempStr := tempStr||' NOORDER '; 
       END IF; 
       IF curseq.cache_size IS NULL THEN 
         tempStr := tempStr||' NOCACHE '; 
       ELSE 
         tempStr := tempStr||' CACHE '||curseq.cache_size||' '; 
       END IF; 
       dbms_output.put_line(tempStr||';'); 
     END LOOP; 
     dbms_output.put_line(chr(10)||chr(10)); 
    END makseq; END srcmake; 
    / set feedback off 
    set serveroutput on 
    set linesize 255 
    spool &文件名 
    exec srcmake.maktab 
    exec srcmake.makview 
    exec srcmake.makseq 
    spool off 
    set serveroutput off 
    set feedback on 
    set linesize 80 
    drop package srcmake 
    /
      

  3.   

    个人还是喜欢用 PLSQLDev中的EXPORT USER OBJECTS工具。一次操作就可以所有的对象。
      

  4.   

    如果你愿意使用dmp文件格式的话给一个语句给你:在系统命令行输入:exp user/password rows=n indexes=y full=y compress=n file="d:\**.dmp" log="**.log"
    具体的参数如下:
    关键字 说明(默认)
    ---------------------------------------------------
    USERID 用户名/口令
    FULL 导出整个文件 (N)
    BUFFER 数据缓冲区的大小
    OWNER 所有者用户名列表
    FILE 输出文件 (EXPDAT.DMP)
    TABLES 表名列表
    COMPRESS 导入一个范围 (Y)
    RECORDLENGTH IO 记录的长度
    GRANTS 导出权限 (Y)
    INCTYPE 增量导出类型
    INDEXES 导出索引 (Y)
    RECORD 跟踪增量导出 (Y)
    ROWS 导出数据行 (Y)
    PARFILE 参数文件名
    CONSTRAINTS 导出限制 (Y)
    CONSISTENT 交叉表一致性
    LOG 屏幕输出的日志文件
    STATISTICS 分析对象 (ESTIMATE)
    DIRECT 直接路径 (N)
    TRIGGERS 导出触发器 (Y)
    FEEDBACK 显示每 x 行 (0) 的进度
    FILESIZE 各转储文件的最大尺寸
    QUERY 选定导出表子集的子句导入用imp语句:
    参数如下:
    USERID 必须是命令行中的第一个参数。关键字 说明(默认)   
    ----------------------------------------------
    USERID 用户名/口令
    FULL 导入整个文件 (N)
    BUFFER 数据缓冲区大小
    FROMUSER 所有人用户名列表
    FILE 输入文件 (EXPDAT.DMP)
    TOUSER 用户名列表
    SHOW 只列出文件内容 (N)
    TABLES 表名列表
    IGNORE 忽略创建错误 (N)
    RECORDLENGTH IO 记录的长度
    GRANTS 导入权限 (Y)
    INCTYPE 增量导入类型
    INDEXES 导入索引 (Y)
    COMMIT 提交数组插入 (N)
    ROWS 导入数据行 (Y)
    PARFILE 参数文件名
    LOG 屏幕输出的日志文件
    CONSTRAINTS 导入限制 (Y)
    DESTROY 覆盖表空间数据文件 (N)
    INDEXFILE 将表/索引信息写入指定的文件
    SKIP_UNUSABLE_INDEXES 跳过不可用索引的维护 (N)
    ANALYZE 执行转储文件中的 ANALYZE 语句 (Y)
    FEEDBACK 显示每 x 行 (0) 的进度
    TOID_NOVALIDATE 跳过指定类型 id 的校验
    FILESIZE 各转储文件的最大尺寸
    RECALCULATE_STATISTICS 重新计算统计值 (N)下列关键字仅用于可传输的表空间
    TRANSPORT_TABLESPACE 导入可传输的表空间元数据 (N)
    TABLESPACES 将要传输到数据库的表空间
    DATAFILES 将要传输到数据库的数据文件
    TTS_OWNERS 拥有可传输表空间集中数据的用户
      

  5.   

    谢谢 atao245993(阿涛) 写了这么一大段过程。
    谢谢大家。我只是想把问题简单化,原来越搞越复杂。 
    导出dmp,一个批处理就可以做; 可是导出一个用户全部对象的sql文件还得这么麻烦, 大家还有什么好的方法没有?