2015-12-22 6 views
1

Я использую Perl DBD :: Oracle, чтобы попытаться объединить массив строк XML в столбец XML XMLTYPE. Я могу заставить его работать, если я вставляю массив в CLOB, но когда я пытаюсь вставить столбец XMLTYPE через Strawberry Perl, он сработает.Массовая вставка в Oracle XMLTYPE с использованием Perl

Может ли кто-нибудь иметь возможность вставлять в XMLTYPE с Perl?

Вот два фрагмента кода. Один для 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"); }

+0

Какая версия DBD :: Oracle вы используете? – collapsar

+0

Пробовал ли вы «INSERT INTO». $ table. '(XMLCONTENT) VALUES (XMLTYPE (?))' Или 'INSERT INTO '. $ table. '(XMLCONTENT) VALUES (XMLPARSE (CONTENT? WELLFORMED))', а затем отправить XML как CLOB? –

+0

@collapsar Version 1.74 – user3676476

ответ

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"); 
}