使用 Perl 批量插入 Oracle XMLTYPE

Posted

技术标签:

【中文标题】使用 Perl 批量插入 Oracle XMLTYPE【英文标题】:Bulk Insert into Oracle XMLTYPE Using Perl 【发布时间】:2015-12-22 09:59:05 【问题描述】:

我正在使用 Perl DBD::Oracle 尝试将 XML 字符串数组批量插入到 Oracle XMLTYPE 列中。如果我批量插入到 CLOB 中,我可以让它工作,但是当我尝试通过 Strawberry Perl 插入到 XMLTYPE 列中时,它会崩溃。

有人可以从 Perl 批量插入 XMLTYPE 吗?

这里是sn-ps的两个代码。一个用于 CLOB,第二个用于 XMLTYPE....

sub save_xml $log->write("Inserting XML messages into table:$table, in $mode: mode"); my @status; my $sql='INSERT INTO ' . $table . ' (XMLCONTENT) VALUES (?)'; my $sth = $dbh->prepare_cached($sql) || die "Cannot prepare statement: $DBI::errstr"; $sth->bind_param_array(1,\@xmldocuments) || die "Cannot bind parameter array: $DBI::errstr"; $sth->execute_array(ArrayTupleStatus=>\@status) || die "Cannot bulk insert into table: $table: $DBI::errstr"; $log->write("Inserted $status rows into table: $table");

sub save_xml $log->write("Inserting XML messages into table:$table, in $mode: mode"); my @status; my $sql='INSERT INTO ' . $table . ' (XMLCONTENT) VALUES (?)'; my $sth = $dbh->prepare_cached($sql) || die "Cannot prepare statement: $DBI::errstr"; $sth->bind_param_array(1,\@xmldocuments, ora_type => ORA_XMLTYPE ) || die "Cannot bind parameter array: $DBI::errstr"; $sth->execute_array(ArrayTupleStatus=>\@status) || die "Cannot bulk insert into table: $table: $DBI::errstr"; $log->write("Inserted $status rows into table: $table");

【问题讨论】:

您使用的是哪个版本的 DBD::Oracle? 您尝试'INSERT INTO ' . $table . ' (XMLCONTENT) VALUES (XMLTYPE(?))'INSERT INTO ' . $table . ' (XMLCONTENT) VALUES (XMLPARSE(CONTENT ? WELLFORMED))' 然后将您的XML 作为CLOB 发送? @collapsar 1.74 版 @WernfriedDomscheit 我收到来自 Oracle 的错误 ora01461 can't bind a LONG only for insert into a LONG column。我想我肯定需要类型减速 $sth->bind_param_array(1,\@xmldocuments, ora_type => ORA_CLOB ) 是否也出现同样的错误? 【参考方案1】:

我无法使用二进制 XMLTYPE 进行批量绑定。但是使用下面的代码逐行处理满足我的要求:

sub save_xml 
   my ($xml) = @_; 
   $log->write("Inserting XML message into table:$table, in $mode mode"); 
   my $sql='INSERT INTO ' . $table . ' (XMLCONTENT) VALUES (:xml)'; 
   my $sth = $dbh->prepare_cached($sql); 
   if ( $mode eq "BINARY" )  
       $sth-> bind_param(":xml", $xml,  ora_type => ORA_XMLTYPE ); 
    else  
       $sth-> bind_param(":xml", $xml); 
    
   $sth->execute() || die "Error whilst inserting into table: $table: $DBI::errstr"; 
   $log->write("Insert into table:$table successful"); 

【讨论】:

以上是关于使用 Perl 批量插入 Oracle XMLTYPE的主要内容,如果未能解决你的问题,请参考以下文章

Oracle:使用 select 插入不返回批量收集新插入的 id

如何从 Oracle 中的 JDBC 批量插入中获取生成的密钥?

Oracle 批量插入数据怎么做

ibatis 批量插入oracle总结

Oracle 批量插入数据怎么做

mybatis使用oracle批量插入