2014-08-14 3 views
1

Я пытаюсь написать скрипт, который будет считывать данные из PostGreSQL таблицы и вставить ее в таблицу оракула, вот мой сценарий:Perl/DBI - Вставка строки из Postgres в таблице Oracle

#!/usr/local/bin/perl 

use strict; 
use DBI; 
use warnings FATAL => qw(all); 

my $pgh = pgh(); # connect to postgres 
my $ora = ora(); # connect to oracle 
my @rows; 
my $rows =[] ; 
my $placeholders = join ", ", ("?") x @rows; 

my $sth = $pgh->prepare('SELECT * FROM "Employees"'); 
$sth->execute(); 
while (@rows = $sth->fetchrow_array()) { 
    $ora->do("INSERT INTO employees VALUES($placeholders)"); 
} 

#connect to postgres 
sub pgh { 
my $dsn = 'DBI:Pg:dbname=northwind;host=localhost'; 
my $user = 'postgres'; 
my $pwd = 'postgres'; 
my $pgh = DBI -> connect($dsn,$user,$pwd,{'RaiseError' => 1}); 
return $pgh; 
} 

#connect to oracle 
sub ora { 
my $dsn = 'dbi:Oracle:host=localhost;sid=orcl'; 
my $user = 'nwind'; 
my $pwd = 'nwind'; 
my $ora = DBI -> connect($dsn,$user,$pwd,{'RaiseError' => 1}); 
return $ora; 
} 

Я получаю следующую ошибку:

DBD::Oracle::db do failed: ORA-00936: missing expression (DBD ERROR: error possibly near <*> indicator at char 29 in 'INSERT INTO employees VALUES(<*>)') [for Statement "INSERT INTO employees VALUES()"] at /usr/share/perlproj/cgi-bin/scripts/nwind_pg2ora.pl line 19. 

Пожалуйста, помогите мне скорректировать мой код. Большое спасибо! Tonya.

+4

Ваш '@ rows' пуст, когда' $ placeholders' получает создан, возможно, было бы хорошо, чтобы прочитать одну строку, а затем воссоздать '$ placeholders' перед установкой' $ ora-> делать (...) ' – abiessu

ответ

2

Смотрите документацию для DBD :: Oracle вы должны связать значение параметра для BLOB-как:

use DBD::Oracle qw(:ora_types); 
$sth->bind_param($idx, $value, { ora_type=>ORA_BLOB, ora_field=>'PHOTO' }); 
1
my @rows; 
my $rows =[] ; 

my $sth = $pgh->prepare('SELECT * FROM "Employees"'); 
$sth->execute(); 
while (@rows = $sth->fetchrow_array()) { 
    my $placeholders = join ", ", ("?") x @rows; 
    $ora->do("INSERT INTO employees VALUES($placeholders)"); 
} 

Вы присоединяетесь к пустующим @rows для создания пустых $ placeholders. выполнить соединение внутри цикла while, перед do().

0

Следующая лениво создает дескриптор инструкции для вставки в базу данных Oracle, основанный на количестве столбцов в возвращаемых записях.

Он вставляет эти значения столбцов в базу данных, так что, очевидно, мы предполагаем, что структуры таблиц одинаковы:

use strict; 
use DBI; 
use warnings FATAL => qw(all); 

my $pgh = pgh(); # connect to postgres 
my $ora = ora(); # connect to oracle 

my $sth = $pgh->prepare('SELECT * FROM "Employees"'); 
$sth->execute(); 

my $sth_insert; 

while (my @cols = $sth->fetchrow_array()) { 
    $sth_insert ||= do { 
     my $placeholders = join ", ", ("?") x @cols; 
     $ora->prepare("INSERT INTO employees VALUES ($placeholders)"); 
    }; 
    $sth_insert->execute(@cols); 
} 
+0

Спасибо большое! есть проблема, что таблица сотрудников в postgres имеет столбец с типом данных BYTEA и вставка в тип данных Oracle BLOB и его удушение на этом, есть ли способ, который я могу вставить исходные данные BYTEA в BLOB в oracle, используя DBI - Tonya – TonyaLepski

+1

Я не знаю, как я сам не использовал Oracle. Я бы предположил, что это новая проблема, и вы должны спросить об этом конкретно. – Miller

+0

Вы посмотрели на документы DBD :: Oracle, которые должны сообщать о работе с Oracle LOB? http://search.cpan.org/~pythian/DBD-Oracle-1.74/lib/DBD/Oracle.pm#LOBS_AND_LONGS –

 Смежные вопросы

  • Нет связанных вопросов^_^