加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl实现不同数据库结果比较 (mysql, oracle, sqlserver)

发布时间:2020-12-16 00:09:43 所属栏目:大数据 来源:网络整理
导读:# 1. sql.txt中有多条sql语句,如下: SELECT * FROM TESTA SELECT * FROM TESTB SELECT * FROM TESTCSELECT * FROM TESTD SELECT * FROM TESTE SELECT * FROM TESTF# 2. perl脚本如下,执行的结果会放在与表对应的csv文件中use strict;use warnings;use DBI
# 1. sql.txt中有多条sql语句,如下:


    SELECT * FROM TESTA
    SELECT * FROM TESTB
    SELECT * FROM TESTC
SELECT * FROM TESTD
    SELECT * FROM TESTE
    SELECT * FROM TESTF
# 2. perl脚本如下,执行的结果会放在与表对应的csv文件中

use strict;
use warnings;
use DBI;

main();

sub main
{ 
    my $dbh_oracle;
    my $dbh_mysql;
    open (IN,"sql.txt") or die "$!,opening sql.txtn";
    open (FAIL,">00fail.csv") or die 'Unable to create diff file for 00fail.csv $!';
    while (<IN>)
    {
        chomp; 
        # Oracle
        $dbh_oracle=DBI->connect("DBI:Oracle:host=xxx.xx.xx.xxx;service_name=xxx;",'xxx','xxx') || die "cannot connect to Oracle:$!n";
        my @oracle = getResult($dbh_oracle,$_);
                
        # Mysql
        $dbh_mysql=DBI->connect('DBI:mysql:database=xxxx;host=xxx.xx.xx.xxx','xxx') || die "cannot connect to mysql:$!n";
        my @mysql = getResult($dbh_mysql,$_);
                
        # SqlServer
        # my $dbh_sqlServr=DBI->connect("DBI:ADO:driver={SQL Server};Server=localhost; database=xxxx;",'xxxx') || die "cannot connect to mysql:$!n";
        # my @sqlserver = getResult($dbh_sqlServr,$_);
        
        my @output = split/ /;
        my $outputname = $output[-1];
        compare(@oracle,@mysql,$outputname);
    }
    
    $dbh_oracle->disconnect();
    $dbh_mysql->disconnect();
    
    close IN;
    close FAIL;
}

sub getResult
{
    my $dbh = shift;
    my $sql = shift;
    
    my @A;
    
    my $sth = $dbh->prepare($sql);
    $sth->execute;
    my $numFields = $sth->{'NUM_OF_FIELDS'};
    
    while (my $ref = $sth->fetchrow_arrayref) {
    my $line = "";
        for (my $i = 0; $i < $numFields; $i++) {
            $line .= $$ref[$i] if(defined $$ref[$i]);
            $line .= ",";
        }
        # print OUT "n";
        push @A,$line; 
    }
    $sth->finish;
    return @A;
}

sub compare
{
    my ($A_ref,$B_ref,$outname) = @_;
    
    my %ta;
    my @onlyA;
    my @onlyB;
    my @same;
    
    foreach (@$A_ref)
    {
        chomp; 
        $ta{$_} += 1;
    }

    my %count = %ta;

    foreach(@$B_ref){ 
        chomp; 
        if (exists($ta{$_}) && $ta{$_} > 0){
            $ta{$_} -= 1;
        }else
        {
            push @onlyB,$_;
        }
    }    
    
    my $countA; 
    
    foreach (keys %ta) { 
        my $tmp = $_;
        if ($ta{$_} >= 0)
        {
            #Only A
            for(1..$ta{$_})
            {
                push @onlyA,$tmp;
            }
            #Same
            for(1..($count{$_} - $ta{$_}))
            {
                push @same,$tmp;
            }
        }
    } 
    
    if ($#onlyB > 0 or $#onlyA > 0)
    {
        print FAIL "$outnamen" if ($#onlyB > 0 or $#onlyA > 0);
        
        open (OUT,">$outname.csv") or die 'Unable to create diff file for $outname.csv $!';
        print OUT "only in Oracle:n";
        print OUT $_."n" foreach @onlyA;
        
        print OUT "only in mysql:n";
        print OUT $_."n" foreach @onlyB;        
        
        print OUT "SAME:n";
        print OUT $_."n" foreach @same; 
        close OUT;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读