Oracle数据的批量插入

Oracle数据的批量插入,第1张

前两天接到一个需求——需要编程将SQL Server中的数据插入至Oracle 数据大约有 多万条记录 开始的时候我采取了直接构建SQL插入的方式 结果耗时太长 为了提高性能我上网找了资料 最终采用DataAdapter批量插入至Oracle 提高了性能

代码如下

一 直接构建SQL语句插入

 

VB NET

         sw Start()

         Read Z J from SQL Server

         Dim sqlCmd As New SqlCommand()

         sqlCmd Connection = sqlConnection

         sqlCmd CommandText = SELECT * FROM  Z J

         Dim sqlDr As SqlDataReader

         sqlDr = sqlCmd ExecuteReader()

         Dim cmdInsertZ J As New OracleCommand()

         cmdInsertZ J Connection = oraConnection

         cmdInsertZ J CommandText = BuildSQLStatement(SQLType Insert z j )

         Dim plantLever material oldMaterialNum materialDescription As Object

       橡冲漏  While sqlDr Read()

             plantLever = ReadSqlDataReader(sqlDr )

             material = ReadSqlDataReader(sqlDr )

             oldMaterialNum = ReadSqlDataReader(sqlDr )

             materialDescription = ReadSqlDataReader(sqlDr )

              Insert to Oracle table Z J

             cmdInsertZ J Parameters AddWithValue( :plantLever plantLever)

             cmdInsertZ J Parameters AddWithValue( :material material)

             cmdInsertZ J Parameters AddWithValue( :oldMaterialNum oldMaterialNum)

             cmdInsertZ J Parameters AddWithValue( :materialDescription materialDescription)

             cmdInsertZ J ExecuteNonQuery()

         End While

         sw Stop()

梁烂          Loger Info( Reading z j form sql sever used sw Elapsed TotalSeconds ToString())

 

二 采用DataAdapter实现批量插入

 

VB NET

         sw Start()

  判或       Read Z J from SQL Server

         Dim sqlCmd As New SqlCommand()

         sqlCmd Connection = sqlConnection

         sqlCmd CommandText = SELECT * FROM  Z J

         Dim sqlDr As SqlDataReader

         sqlDr = sqlCmd ExecuteReader()

         Dim cmdInsertZ J As New OracleCommand()

         cmdInsertZ J Connection = oraConnection

         cmdInsertZ J CommandText = BuildSQLStatement(SQLType Insert z j )

         Dim dtSqlZ J As New DataTable

         dtSqlZ J Columns Add( plantLever )

         dtSqlZ J Columns Add( material )

         dtSqlZ J Columns Add( oldMaterialNum )

         dtSqlZ J Columns Add( materialDescription )

         Dim plantLever material oldMaterialNum materialDescription As Object

         While sqlDr Read()

             plantLever = ReadSqlDataReader(sqlDr )

             material = ReadSqlDataReader(sqlDr )

             oldMaterialNum = ReadSqlDataReader(sqlDr )

             materialDescription = ReadSqlDataReader(sqlDr )

             dtSqlZ J Rows Add(plantLever material oldMaterialNum materialDescription)

         End While

         sw Stop()

         Loger Info( Reading z j form sql sever used sw Elapsed TotalSeconds ToString())

         sw Start()

         Dim oraDa As New OracleDataAdapter()

         oraDa InsertCommand = cmdInsertZ J

         oraDa InsertCommand Parameters Add( :plantLever OracleType Char plantLever )

         oraDa InsertCommand Parameters Add( :material OracleType Char material )

         oraDa InsertCommand Parameters Add( :oldMaterialNum OracleType Char oldMaterialNum )

         oraDa InsertCommand Parameters Add( :materialDescription OracleType Char materialDescription )

         oraDa InsertCommand UpdatedRowSource = UpdateRowSource None

         oraDa UpdateBatchSize =     Adjust the batch size based on testing result

         oraDa Update(dtSqlZ J)

         sw Stop()

lishixinzhi/Article/program/Oracle/201311/18480

批量插入数据脚本

1、第一种批量插入数据脚本,可锋胡以基本满足要求。理解上较为简单,所以这个最常用。

NEXTVAL和CURRVAL的区别银余拦:

1、如果 sequence.CURRVAL 和 sequence.NEXTVAL 都出现在一个 SQL 语句中,则序列只增加一次。在这种情况下,每个 sequence.CURRVAL 和 sequence.NEXTVAL 表达式都返回相同的值,不管在语句中sequence.CURRVAL 和 sequence.NEXTVAL 的顺序。

执行脚本结果如下:

3、两个表,同时批量插入数据的脚本

3、

4、 涉及子表时,批量插入数据脚本,

5、 批量修改数据

时间取数方式:

一、SYSTIMESTAMP(取当前系统值)

二、SYSDATE(取当前系统值,但只精确到时,分和秒都为0)

三、固定值为:TO_TIMESTAMP ('2019-2-12 15:24:45.703000', 'yyyy-mm-dd hh24:mi:ss.ff6')

把固定的字段改为变量:

方式一:’||i||’ 例:’{“no”:“111’||i||’”}’(此方式)

方式二:concat 例:concat(concat(’{“blNo”毁数:111"’,i),’"}’)

使用loop循环,比如:

for item in (select a,b,c from table_a where 条件) loop

insert into table_b(a,b,c) values (item.a,item.b,item.c)

end loop

也可以使用索引表循环,以上只是一个简单的例子,需要根据你的具体情况选择循环方式。

1、采渣衫销用insert into values 语句插入一条,写很多条语句即可多条如游数据,这种主要针对于离散值以及一些基础信息的录入,如:insert into test(xh,mc) values('123','测试')

如果插入的数据有规律,可利用for、loop循环插入,主要用于批量生成测试数据

begin

for i in 1 .. 100 loop

insert into test(xh,mc) values(i||'','测试')

end loop

end 。

2、采用insert into selct from 语句来一次性插入一个集合,这种主要依据于要插入的数据源已经存储于数据库对象中,或者利用dual虚表来构造数据,经过加工后写入一个集合。

insert into test (xh,mx) select '123','测试' from dual

3、采用plsql等工具、或者oracle的imp、impdp命令来导入,这种主要用数据库与数据库之间塌升的大批量数据导入,导入的数据格式为plsql的pde、oracle的dmp等。dmp文件可使用

table_exists_action参数控制导入动作:replace替换原表,truncate清除原表数据再导入,append增量导入数据,当然impdp数据泵的导入要依赖于directory路径。

impdp 用户名/密码 dumpfile=123.dmp logfile=123.log directory=imp_dir tables=test table_exists_action=append。

4、使用excel文件直接拷贝。这种主要用于要写入的数据已是excel文件或者行列分明的其它格式文件,每一列的值和表结构相对应,可直接打开表的行级锁,把数据拷贝进入。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11975018.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存