各位仁兄:
    题目读起来有点抽象,我将具体情况描述一下。
    假定A为一个Oracle数据库,内有a表,本人项目目标是要将第三方软件获取的数据写入a表。
    开发中自建了一个Oracle测试数据库B,在B中建立了测试表b,b表字段与a表字段一一对应,但ab两表的用户和表空间等其他参数都不同。
    现场测试时,客户不让我们直接将数据写入a表,于是我们只能考虑定期,如一周一次第将b表中新增数据写入a表。
    请问各位有什么好的方法。

解决方案 »

  1.   

    你可以建立数据库链路(DB LINK),再通过加一个数据库作业(用包DBMS_JOB)定期地将数据写到a库中。
      

  2.   

    to: wangybyangxr(王永斌)   
    我遇到的情况是两个数据库在不同的局域网内。A库导出的数据只能存放在移动设备中,B库再从移动设备中导入数据,有什么好的解决方案吗?
      

  3.   

    用Streams Replication 可以保持多个数据库之间的同步问题,问题是你的"数据库们"能够communicate to each other.
      

  4.   

    我有如此想法:做一个exe可执行程序,不用安装的,在A库所在机子上运行导出我的数据,生成某种格式的文件,再在B库所在的机子上运行该可执行程序,能将该数据文件导入b表。不知有没有可行性。总之不能在B库所在的机子上装软件。
      

  5.   

    不好意思,我自己在回复中将A B a b弄混了,请各位参照原问题中的描述,明白我的大体意思就行了。
      

  6.   

    提供给你一个方案:
    分两步走:
    第一步:将B的数据写成一个文件存入移动盘,以CSV的格式。
    第二步:用SQLLDR 将导出的文件导入到A中。其中:第一步我写好了三个SQL的文件,你只要运行其中一个就行(ExportTable.sql),其他两个在这个文件中调用。运行后将生成文件 表名.csv 和 表名.ctl。
    第二步用SQLLDR时将这两个文件加入其中的参数即可。以下是文件的源码:
    --文件1:ExportTable.sql
    accept TableName prompt 'Table to export:'set concat ~prompt Data file - &TableName~.csvprompt Control file - &TableName~.ctlspool &TableName~.sqlstart GetLoaderData &TableNamespool &TableName.csvstart &TableNamespool &TableName~.ctlstart GetLoaderControl &TableNamespool offhost del &TableName~.sqlrem host rm &TableName~.sqlset termout on
    --文件2:GetLoaderControl.sql
    --执行者: ExportTable.sql
    set pause off
    set newpage none
    set heading off
    set concat ~
    set feedback off
    set verify off
    set linesize 80
    set trimspool on
    set trimout off
    set termout off
    column ord noprint
    select 1 ord,'load data' from dual
    union
    select 2 ord,'infile &&TableName.csv' from dual
    union 
    select 3 ord,'append' from dual
    union
    select 4 ord,'into table &TableName' from dual
    union 
    select 5 ord,'fields terminated by ' || ''';''' from dual
    union
    select 6 ord,'(' from dual
    union
    select 10*column_id ord, column_name || ' ' || 
    decode(data_type,
    'NUMBER','decimal external',
    'VARCHAR2','char',
    'CHAR','char',
    'DATE','date') || ','
    from user_tab_columns 
    where table_name = upper('&TableName')
    and column_id not in ( select max(column_id) 
    from user_tab_columns 
    where table_name = upper('&TableName') )
    union
    select 1000*column_id ord,column_name || ' ' || 
    decode(data_type,
    'NUMBER','decimal external',
    'VARCHAR2','char',
    'CHAR','char',
    'DATE','date') || ')'
    from user_tab_columns 
    where table_name=upper('&TableName') 
    and column_id in ( select max(column_id) 
    from user_tab_columns 
    where table_name = upper('&TableName') )
    order by ord;--------------------------------------------------------------------------------------------------------------
    --文件3:GetLoaderData.sql
    --执行者: ExportTable.sql
    set pause off
    set newpage none
    set heading off
    set concat ~
    set feedback off
    set verify off
    set linesize 1000
    set trimspool on
    set trimout on
    set termout off
    column ord noprint
    select 0 ord, 'select',null,null,'rtrim('||column_name ||')'
    from user_tab_columns 
    where table_name = upper('&&TableName') 
    and column_id=1
    union
    select column_id ord, '||' , ''';''' , '||' ,'rtrim('||column_name ||')'
    from user_tab_columns 
    where table_name = upper('&TableName') 
    and column_id > 1
    union
    select 1000 ord, '||' , ''';''' , null, 'from &TableName order by 1;'
    from dual
    order by ord;
      

  7.   

    to:  wangybyangxr(王永斌)
    相当感谢永斌兄提供源码,能够直接用固然好,但从学习的角度我确实看不懂,要是能有注释就好了。
    另外问个可能幼稚的问题:那些都是SQL语句吗?我能用stmt.execute(sql)执行吗?
      

  8.   

    呵呵。
    第一步是在SQL PLUS中运行(在操作系统命令行中直接运行SQLPLUS),第二步在SQLLODER中运行(在操作系统命令行中直接运行SQLLDR),哪句不懂,我为你解释。^-^
      

  9.   

    补充问一下:表中有数据类型为Timestamp的字段,导出到CSV文件中后都成了文本了,又怎么可能导得还原喃?
      

  10.   

    只要没有BLOB、CLOB、BFILE、LONG等系列的字段就行,SQLLDR会给你做转换的,另外,如果不是导出整张表,加个WHERE条件就行了。
      

  11.   

    又一问:我已初步决定用JAVA做图形界面,以向导的方式指导用户使用导入导出功能,如何才能使用你的那些SQL语句喃?我总有个固定的思维模式,例如将你的第一个文件内容转为一个字符串sql,不晓得stmt.execute(sql)这种语句能否生成你提到的CSV和CTL这两个文件?
      

  12.   

    to wangybyangxr(王永斌):
      我这小软件搞定了,用的还是java GUI,导出的数据自定义了格式存为文本文件,虽然没用你的pl/sql语句,但还是从中学到了点东西,多谢。看各位过客还有没有啥说的,我过些天就结贴了。