在早期的DBD Oracle (1.18)以前, Array DML的接口是假的, 其实是一条一条地执行的, 而DBD Oracle的主要编写人员也受到了很多开发人员的质问. 在DBD-Oracle v1.19的更改列表中, 我看到了下面的几行:
=head1 Changes in DBD-Oracle 1.18 (svn rev 6697)
Added support for native Oracle Array interface thanks Kristian Nielsen
Added suppot for LOB Locators from Jeffrey Klein.
Updated README.win32.txt for Oracle 10xe and new Visual C++ version
Updated README.lunix.txt for work-araound for UTF8 bug
Fixed a number of compile warings
于是我在本机上验证了一把, 我们只要用SQL_TRACE去看一下执行次数就可以了, 如果是真正的Array DML, 那执行数次应当是1次, 否则应当是很多次. 在这儿我的数组的长度是10, 执行的输出结果如下:
Return: 10
Status: -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
从下面的SQL_TRACE的结果(用tkprof格式化过)来看, 本机的DBD-Oracle v1.19已经的确支持真正的Array DML了.
INSERT INTO T_PERLARRAY
VALUES
(:p1, :p2)
call count ... query current rows
------- ------ ... ---------- ---------- ----------
Parse 1 ... 0 0 0
Execute 1 ... 1 21 10
Fetch 0 ... 0 0 0
------- ------ ... ---------- ---------- ----------
total 2 ... 1 21 10
如果你想用Perl来高效地编写数据装载程序, 就请升级DBD-Oracle吧.
留言 (2)
Array DML?
呵呵,我更习惯叫做Bulk Operation,Bulk Insert,Bulk Update,Bulk delete……
Posted by rollingpig | Jan 12, 2007 12:58 PM
用一个数组去当绑定变量, 我一直叫他们Array DML. 这个和Direct Load还是不同的, Direct Load我也会称它为Bulk Insert.
Posted by anysql | Jan 12, 2007 1:03 PM