Переносим таблицы из MS SQL в Oracle
Появилась задачка - перенести таблицы из MS SQL в ORACLE с примерных сохранением типа столбцов.
Покопавшись в интернете и почитав что пишут люди - написал скрипт, который берет и создает инструкции для создания таблиц в Oracle.
Скипт приложен. Скрипт берет все таблицы указанного пользователия, проверяет каждое поле на тип и заменяет на соотвествующий из Oracle, именя таблиц тоже менюются, т.к. в Oracle имя таблицы не может быть более 30 символов.
#!/usr/bin/perl
use DBI;
my @data;
$dbh=DBI->connect(’DBI:Sybase:server=srv1;database=ZZZZZZZ’,'XXXX’,'YYYY’) or
die “Couldn’t connect to database: ” . DBI->errstr;
@t_INTEGER=(’bigint’,'decimal’,'int’,'numeric’,’smallint’,'tinyint’,'uniqueidentifier’);
@t_VARCHAR=(’char’,'nchar’,'ntext’,'nvarchar’,'text’,'varchar’,’sysname’);
@t_NUMBER=(’float’,'real’,'bit’);
@t_DATE=(’datetime’,’smalldatetime’,'timestamp’);
%changes=(’date’=>’dates’,'time’=>’times’,'values’=>’valuess’,
‘comment’=>’comments’,'connect’=>’connects’,'number’=>’numbers’,'rowid’=>’rowids’,
‘location’=>’locations’,'long’=>’longs’,'clear’=>’clears’,'result’=>’results’,
‘count’=>’counts’,'name’=>’names’,’section’=>’sections’,'limit’=>’limits’);
$prefix=’DAT’;
open (TH,’tables.lst’); — файл со списком таблиц которые нужны.
while (<TH>){
chomp;
$_=~ /(\w+)/;
$tables{uc($1)}=1;
}
close(TH);
#foreach (keys(%tables)) { print “[$_] => “.$tables{$_}.”\n”;}
#exit;
%tables2=%tables;
my $sth=$dbh->prepare(”select * from sysobjects where uid=1 and xtype=’U’ order by name”); — тут выбирается какого пользователя таблицы нам нужны
$sth->execute();
@tabs=();
while (@data=$sth->fetchrow_array())
{
@exch_cols=();
my $tablename=@data[0];
my $id=@data[1];
$old_tablename=$tablename;
print “\n\n–Processing table “.uc($tablename).” ($id)\n”;
#print “”.uc($tablename).” - “.$tables{uc($tablename)}.”\n”;
unless (exists($tables{uc($tablename)}))
{
print “–!!!table $tablename not in need tables\n”;
next;
}
delete($tables2{uc($tablename)});
my $id=@data[1];
$pk_key=”;
# print “\n\n–Processing table $tablename ($id)\n”;
– тут вытягиваем первичный ключ.
my $sth2=$dbh->prepare(”SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME=N’$tablename’ AND OBJECT_ID(CONSTRAINT_NAME,’PK’) IS NOT NULL ORDER BY ORDINAL_POSITION;”);
$sth2->execute();
@keys=();
while (@data=$sth2->fetchrow_array())
{
push(@keys,@data[0]);
}
my $sth2=$dbh->prepare(”select c.name, t.name,c.length from syscolumns c,systypes t where c.xtype=t.xtype and c.id=$id order by c.colorder”);
$sth2->execute();
@cols=();
# print “create table $tablename (\n”;
$pk_key=”;
while (@data2=$sth2->fetchrow_array())
{
$colname=@data2[0]; ## if ($colname eq ‘id_rec’) {$pk_key=’id_rec’;}
$coltype=@data2[1];
$length=@data2[2];
#print “\t$colname $coltype($length)\n”;
$old_colname=$colname;
– делаем замены типов
if (exists($changes{lc($colname)})) {$colname=$changes{lc($colname)}; print “– ъБНЕОБ $colname\n”; push(@exch_cols,”$old_colname:$colname”);}
if (in_array(\@t_INTEGER,$coltype)) { push(@cols,”$colname INTEGER”); }
elsif (in_array(\@t_VARCHAR,$coltype)) { push(@cols,”$colname VARCHAR2($length)”);}
elsif (in_array(\@t_NUMBER,$coltype)) { push(@cols,”$colname NUMBER”);}
elsif (in_array(\@t_DATE,$coltype)) { push(@cols,”$colname VARCHAR2(25)”);}
elsif ($coltype eq ‘image’) { push(@cols,”$colname BLOB”);}
else {print “!!! $coltype $length\n”;}
}
$cols_=join(”,\n”,@cols);
– заменяем имя таблицы (усекаем ее)
@tabparts2=();
if (length($tablename)>16) {
@tabparts=split(’_',$tablename);
$t=”;$i=0; $add=”;
foreach $tp(@tabparts){
if ($i<4) {push(@tabparts2,substr($tp,0,3));}
if ($i>3) {$add=$add.substr($tp,0,1);}
$i++;
}
$t=join(’_',@tabparts2); $t=$t.$add;
if (exists($tbbss{$t})) {$t=$t.”2″;}
$tbbss{$t}=1;
print “–хУЕЮЕОЙЕ ЙНЕОЙ ФБВМЙГЩ $tablename -> $t\n”;
$tablename=$t;
}
print “create table “.$prefix.”_$tablename (
$cols_
);
–print “–sql–insert into excl_tbl (’tablename’,'primary_keys’,'new_tablename’,'cols_replacments’) values (’”.$old_tablename.”‘,’”.join(’,',@keys).”‘,’”.$tablename.”‘,’”.join(”;”,@exch_cols).”‘);\n”;
#
#print $cols_;
# print “\n);\n\n”;
# exit;
}
print “\n\n–оЕ ОБКДЕОЩ УМЕДХАЭЙЕ ФБВМЙГЩ:\n”;
foreach (keys(%tables2)) { print “\t$_\n”;}
sub in_array {
my ($arr,$search_for) = @_;
return grep {$search_for eq $_} @$arr;
}