各位仁兄:
题目读起来有点抽象,我将具体情况描述一下。
假定A为一个Oracle数据库,内有a表,本人项目目标是要将第三方软件获取的数据写入a表。
开发中自建了一个Oracle测试数据库B,在B中建立了测试表b,b表字段与a表字段一一对应,但ab两表的用户和表空间等其他参数都不同。
现场测试时,客户不让我们直接将数据写入a表,于是我们只能考虑定期,如一周一次第将b表中新增数据写入a表。
请问各位有什么好的方法。
题目读起来有点抽象,我将具体情况描述一下。
假定A为一个Oracle数据库,内有a表,本人项目目标是要将第三方软件获取的数据写入a表。
开发中自建了一个Oracle测试数据库B,在B中建立了测试表b,b表字段与a表字段一一对应,但ab两表的用户和表空间等其他参数都不同。
现场测试时,客户不让我们直接将数据写入a表,于是我们只能考虑定期,如一周一次第将b表中新增数据写入a表。
请问各位有什么好的方法。
我遇到的情况是两个数据库在不同的局域网内。A库导出的数据只能存放在移动设备中,B库再从移动设备中导入数据,有什么好的解决方案吗?
分两步走:
第一步:将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;
相当感谢永斌兄提供源码,能够直接用固然好,但从学习的角度我确实看不懂,要是能有注释就好了。
另外问个可能幼稚的问题:那些都是SQL语句吗?我能用stmt.execute(sql)执行吗?
第一步是在SQL PLUS中运行(在操作系统命令行中直接运行SQLPLUS),第二步在SQLLODER中运行(在操作系统命令行中直接运行SQLLDR),哪句不懂,我为你解释。^-^
我这小软件搞定了,用的还是java GUI,导出的数据自定义了格式存为文本文件,虽然没用你的pl/sql语句,但还是从中学到了点东西,多谢。看各位过客还有没有啥说的,我过些天就结贴了。