VB程序如何用ADO向Oracle存储过程传递数组参数?
应用需求是每次要插入5万条记录,数据库是Oracle11g,客户端是VB6程序,用ADO连接数据库。如果客户端执行Insert语句,再怎么优化也至少要用几十秒。所以我在O...
应用需求是每次要插入5万条记录,数据库是Oracle 11g,客户端是VB6程序,用ADO连接数据库。
如果客户端执行Insert语句,再怎么优化也至少要用几十秒。所以我在Oracle做了存储过程,利用forall语句对数组的批量处理,模拟测试只需几十毫秒(这才是大型数据库应有的高性能啊!)。问题是作为客户端的VB程序,如何将大量数据作为参数传递给存储过程呢?
如果VB将数据拼接成一个大字符串传递,总是突破不了32767字节的限制。并且,Oracle的存储过程内分割字符串也比较慢(Oracle本身不提供split这样直接分割的函数,只能自己循环调用instr函数和substr函数),多次调用存储过程累计插入5万条记录要8秒。
所以还是应该用数组向存储过程传递参数,这样存储过程内的forall语句就能直接用数组批量。为此,我已经将存储过程的参数类型定义为s_array(Oracle不直接支持数组,必须利用自定义数据类型varray(50000) of varchar2(50))。但是在VB客户端这边,adodb.parameter对象虽然可以定义type属性为adArray + adVariant,运行起来却报告“类型名称错误”;按说,既然type常量有adArray这样的关键字,ADODB的机制是支持数组参数的啊,到底应该如何使用呢? 展开
如果客户端执行Insert语句,再怎么优化也至少要用几十秒。所以我在Oracle做了存储过程,利用forall语句对数组的批量处理,模拟测试只需几十毫秒(这才是大型数据库应有的高性能啊!)。问题是作为客户端的VB程序,如何将大量数据作为参数传递给存储过程呢?
如果VB将数据拼接成一个大字符串传递,总是突破不了32767字节的限制。并且,Oracle的存储过程内分割字符串也比较慢(Oracle本身不提供split这样直接分割的函数,只能自己循环调用instr函数和substr函数),多次调用存储过程累计插入5万条记录要8秒。
所以还是应该用数组向存储过程传递参数,这样存储过程内的forall语句就能直接用数组批量。为此,我已经将存储过程的参数类型定义为s_array(Oracle不直接支持数组,必须利用自定义数据类型varray(50000) of varchar2(50))。但是在VB客户端这边,adodb.parameter对象虽然可以定义type属性为adArray + adVariant,运行起来却报告“类型名称错误”;按说,既然type常量有adArray这样的关键字,ADODB的机制是支持数组参数的啊,到底应该如何使用呢? 展开
2个回答
2014-07-23
展开全部
何苦如此呢,要达到最高效率,当然不能再去解析字符串了,建一张临时表tab,把你要传递的参数插入tab中,存储过程中直接关联下tab不就获取到你要的数据了么
更多追问追答
追问
把5万条数据先插入临时表?问题不是同样吗,客户端仍然面临如何高效插入大量数据的问题啊?
追答
搞不懂,你这5万条数据是从哪里获取的,vb一个个计算得到的?还是数据库表里面查出来的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询