Переносим таблицы из 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;
}

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

CAPTCHA image
*