现有一备份文件。。我想把其中一些表导入或导出来。。怎么办????
imp system/manager@TEST  file=d:\daochu.dmp  tables=(table1)  这个命令的tables写死了。。如果有几十,上百上张的话就不行我把要导的表名都存在一张表中。。用什么办法可以在导的时候动态调用???

解决方案 »

  1.   

    imp命令有一个pfile参数,可以将所有的imp参数保存到pfile指定的一个文本文件里面去,执行imp命令时,只要调用
    imp pfile=mypfile.txt就可以了,如你的imp命令可以将参数保存到c:\mypfile.txt中,里面的内容是userid=system/manager@test
    file=d:\daochu.dmp
    tables=(table1)所以楼主这里就是要生成一个pfile文件就容易导入了,建立楼主用pl/sql语句拼出pfile文件的内容,然后保存到c:\mypfile.txt中去,举个例子,假设要导出的表保存在imptab表中,其内容为:tabname(字段)
    EMP
    DEPT
    SALARY则sql语句为set serveroutput on
    SET heading off
    SET pagesize 0
    SET FEEDBACK OFF
    SPOOL c:\mypfile.txt
    DECLARE
      l_tabs VARCHAR2(2000);
    BEGIN
      DBMS_OUTPUT.PUT_LINE('userid=system/manager@test'||CHR(10)||
           'file=d:\daochu.dmp'||CHR(10)||
           'tables=');
      FOR rowtab IN (SELECT tabname FROM imptab) LOOP
        l_tabs := l_tabs || rowtab.tabname || ',';
      END LOOP;
        DBMS_OUTPUT.PUT_LINE(substr(l_tabs,1,length(l_tabs)-1));
    END;
    /
    spool off
    set serveroutput on
    SET heading off
    SET pagesize 0
    SET FEEDBACK OFF
    这个办法不知道对你是否可行
      

  2.   

    不好意思。。我是初学者。。1楼的方法有点看不懂。。能否简单一点,还是谢谢1楼。
    我的思路:imp parfile=/filepath/import9.par
    import9.par这个文件里面
    rows=y
    file=c:\test.dmp
    tables=(
    table1,
    table2,
    table3,
    .....
    tablen
    )    这样可以吗?
      

  3.   


    就是这样啊,我们的思路是一样的,只是我利用pl/sql把import9.par给构造出来了,主要是tables参数的内容,这个内容是从表里取得的,我这里假设保存要导入的表的名字为imptab,例名为tabname,楼主只要把我的例子中的SELECT tabname FROM imptab中的tabname替换为列名,imptab替换为表名,rowtab.tabname的tabname替换为列名,然后在SQL*PLUS中执行上面的命令就可以了,这样参数文件就在c:\mypfile.txt中了。如果是linux也一样,把spool c:\mypfile.txt替换为spool /filepath/import9.par
      

  4.   

    哦。。原来是这个意思。。用pl/sql生成.par。高手但是现在又遇到一个问题。。用imp导入这么多表的时候。。有没有办法使其覆盖相同步的表呢??我在网上查了的只查到impdp方法中有个参数可以。只是不太会用impdp。。1楼的。。你还知道imp有什么办法可以做到吗,因为表太多。。所以先drop再导入不太方便
      

  5.   

    imp无法覆盖相同的表,有一个参数ignore,如果设为n(这是缺省值),则库里有相同表名报错,如果设为y,则imp忽略创建表的过程,直接导入数据,但是很容易出现主键重复的错误,而且出了错每条记录都会提示出来.建议你用impdp,这个其实很容易,只是要用到一个directory对象,Oracle已经预先创建了一个data_pump_dir,这个对象对应的目录到dba_directories视图中去找,导出命令为expdp system directory=data_pump_dir dumpfile=myfile.dmp logfile=aa.log tables=t1,t2,t3导入命令为
    impdp system directory=data_pump_dir dumpfile=myfile.dmp logfile=aa.log full=y
      

  6.   

    directory=data_pump_dir这个是Oracle已经预先创建的。。名字不变????                      问题是。。我不是导入所有的表啊。full=y我在里面加上parfile=/filepath/import9.par import9.par这个文件里面 
    rows=y 
    file=c:\test.dmp 
    tables=( 
    table1, 
    table2, 
    table3, 
    ..... 
    tablen 
    )   里面的语法与imp不一样。。报错。。能否举个实例。。谢谢。。