客户处的两个系统,是内外网隔离的。现外网系统需要使用内网的海量数据,因此解决方案是将内网数据导出到外网数据库中。
目前有以几个问题:
1、内网需导出的数据需要有查询条件,不是所有的表都出。
2、最大的数据表经查询后有1000万条。
3、想通过存储过程的方式来实现导出。导出格式目前未定。请各位大哥,给点思路或具体的导出方法,有语句更佳。

解决方案 »

  1.   

    http://dev.csdn.net/article/82/82431.shtm
      

  2.   

    直接exp,imp给个语句参考下,直接修改表名和查询条件
    exp user/passwd@SID file=d:\bak_2008.03.dmp tables=(aa_database_log) query=\"where  log_datetime  between to_date('2008-05-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') and  to_date('2008-06-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss')\"  STATISTICS=NONE
      

  3.   

    先看一下你需要导入的表有多些,如果少的话,就先把表的创建脚本和数据生成一个sql文本,到外网数据库执行,如果碰到数据量大的表,就将单表用imp命令导入
    imp system/manager@TEST  file=d:\daochu.dmp  tables=(table1) 
      

  4.   

    --对于需要查询条件导入的建议
    听楼主的意思内外网隔离,不知道能否ping通外网,如果可以建立dblink就可以将内网需要查询的表做个视图,比如dblink的名字为ABC
    则:
    insert into tableName select * from v_view@ABC ;如果不能建立dblink的话,可以使用toad工具先把数据筛选出来之后存成.sql文件,筛选用漏斗的图标,存sql文件用“Save dataset as...”这个图标,当鼠标运行到这个图标上的时候会显示这行英文的
      

  5.   

    --创建存储过程
    create or replace procedure p (eno in number)
    is 
      empname varchar2(200);
      begin
        select ename into empname from emp where empno= eno;
        dbms_output.put_line('编号'||eno||'的姓名是'||empname);
      end p;
      
     execute p(7369);
     --带输出参数孤存储过程
     create or replace procedure p1(eno in number,outename out varchar2)
     is 
      begin
        select ename into outename from emp where empno=eno;
      end p1;
     --执行带输出参数孤存储过程
      declare 
       ename varchar2(200);
       begin
        p1(7369,ename);
        dbms_output.put_line(ename);
       end;
       --带输入输出参数的存储过程
       create or replace procedure p2(n1 in out number,n2 in out number)
       is 
       ntemp number;
       begin
         ntemp := n1;
         n1 := n2;
         n2:=ntemp;
         dbms_output.put_line('n1='||n1);
         dbms_output.put_line('n2='||n2);
       end;
       --执行
       declare 
       n1 number :=100;
       n2 number :=200;
       begin
         p2(n1,n2);
       end;
       --函数
        create or replace function a (eno number)
        return varchar2
        is 
        en varchar2(200);
        begin
          select ename into en from emp where empno=eno;
          return en;
        end;
        --执行
        select a(7369) from dual;
        
         declare 
         en varchar2(200);
         begin
           en :=a(7369);
           dbms_output.put_line(en);
         end;
         --自主事务处理
         create or replace procedure p3
         is 
         a varchar2(200);
         --自主事务
         pragma autonomous_transaction;
         begin
           select ename into a from emp where empno=7369;
           dbms_output.put_line(a);
           rollback;
         end;
         
         create or replace procedure p4
         is
         b varchar2(200);
         begin
           update emp set ename='aaa' where empno=7369;
           p3();
           select ename into b from emp where empno=7369;
           dbms_output.put_line(b);
         end;
         --程序包
         --定义包的规范
          create or replace package p7 is
          procedure a (emno in number);
          function b(eno number) return varchar2;
          end p;
          --定义包的主体部分
          create or replace package body p7 is
          procedure a (emno in number)
          is 
           emname varchar2(200);
           begin
             select ename into emname from emp where empno=eno;
           end a;  
           function b (eno number) return varchar2
           is 
           emname varchar2(200);
           begin
             select ename into emname from emp where empno = eno;
             return emname;
           end b;
           end p7;
           
           --程序包中的游标
           create or replace package pack is
           cursor ord_cur (ceno number) return emp%rowtype;
           procedure ord_pro(pempno number);
           end pack;
           
           create or repalce package body pack is
           cursor ord_cur (ceno number) return emp%rowtype is select * from emp where empno=ceno;
           procedure ord_pro(pempno number) 
           is
           or_rec emp%rowtype;
           begin
             open ord_cur(pemno);
             loop
               fetch ord_cur into or_rec;
               exit when ord_cur%notfound;
               dbms_output.put_line('返回值为:'||or_rec.ename);
             end loop;
             close ord_cur;
                     end ord_pro;
             end ord_cur;       end pack;
           
           ---上机
           --9、创建包含以下列的my_toys表ID       
           --varchar2(5),
           --NAME    varchar2(20),
          -- PRICE    number
          --创建包含一个过程和一个函数的toypack包,将过程和函数分别命名为updatetoyprice和avgtoyprice。
          --过程应将每个玩具的单价增加10%,直到所有玩具的平均价格达到400。
          --此外,过程还应保证任一玩具的价格不超过500。
          create table my_toys(
          id varchar2(5),
          name varchar2(20),
          price number
          );
          
          create or replace package toypack is
          procedure updateToyPrice;
          function AvgToyPrice return number;
          end;
          
          create or replace package body toypack is
          procedure updateToyPrice as
          avgprice number;
          begin
            avgprice = AvgToyPrice;
            while (avgprice <=400)
             loop
              update my_toys set price=
              case when price*1.1 < 500 then pirce*1.1
              else price end;
              avgprice := AvgToyPrice;
             end loop;
             commit;
          end;
          function AvgToyPrice return number;
          as
          avgprice number;
          begin
           select avg(price) int avgprice from my_toys;
           return avgprice;
          end;
          end;
          
          ---------
          create or replace procedure
          rate_on_sal (e_code salary_detail.empcode%type)
          as
          v_salary number(10);
          begin
            select salary into v_salary from salary_details where empcode=e_code;
            v_salary :=v_salary*0.95;
            dbms_output.put_line(v_salary);
          end;
          
          -----------上机--员工月工资计算
          create  table in_salary(
           id varchar2(20),
           in_salary number,--应扣
           tody date
          );
          --=======
          create table out_salary(
            id varchar2(20),
            out_salary number,--应发
            today date
          );
          
          insert into in_salary values('7369',200,sysdate);
          insert into in_salary values('7499',300,sysdate);
          insert into in_salary values('7521',400,sysdate);
          insert into in_salary values('7566',100,sysdate);
          
          create or replace procedure cal_salary
          as
           --cursor cur is select sal,nvl(comm) from emp;
           rowresult emp%rowtype;
           out_money number;
          begin
           open cur;
           loop
            fetch cur into rowresult;
            exit when cur%notfound;
            dbms_output.put_line('用户名:'||rowresult.ename||'SAL'||rowresult.sal);
             begin
            select in_salary into out_money from in_salary where id =rowresult.empno;
            dbms_output.put_line(rowresult.empno||'应扣的钱'||out_money);
            insert into out_salary values(rowresult.empno,rowresult.sal+rowresult.comm-out_money,sysdate);
           
            exception
             when others then  
            dbms_output.put_line('这个员工没有钱');
            insert into in_salary values(rowresult.empno,0,sysdate);
            end; 
          end loop;
          
          end;
          
          execute cal_salary;