`
zengshaotao
  • 浏览: 777418 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

批量执行sql

    博客分类:
  • perl
 
阅读更多
#!/usr/bin/perl -w
#Description:load data
#Auther:suzm
#Date  :2014-11-10
use DBI;
use strict;
push(@INC,'/home/tpms_dev/catpm/current/batch/lib/perl');
require public_pg;
 
my $path_log=$ENV{TPMS_EOD_LOGPATH};
unless(defined($ARGV[0])){
     $ARGV[0]="error";
}
 
my $log_name=CITIC::getscript_name($0)."_".CITIC::getscript_name($ARGV[0]);
my $log_file=CITIC::create_logfile($log_name,$path_log);
my $sqlfile=undef;
my $sqlpath=$ENV{TPMS_EOD_SQLPATH};
my $TPMS_EOD_SID=$ENV{TPMS_EOD_SID};
select $log_file;
$|=1;
 
#解析SQL数据文件,把sql语句解析出来,return arraylist;
sub analyze_sqlfile{
     my ($filename)=shift;   
     my $sql;
     my @batch_sql;
     eval{
          #print "${sqlpath}${sqlfile}\n";
          open(SQLFILE,"<:encoding(utf8)","${sqlpath}${sqlfile}") or die "Can't open file :$!\n";
          };
     if($@){
          CITIC::showtime(); print "An error occurred ($@)\n" ;
          return 1;
     }
     while(<SQLFILE>){
          if($_ =~ /;$/ ){
               $sql .=$_;
               push(@batch_sql,$sql);
               $sql=undef;
       
     # print $_;
          }else{
               $sql .=$_;
          }
          # print;
     }
     close SQLFILE;
      
return @batch_sql;
}
 
#sql excute method
sub excute_sql{
     my ($dbh,@sql_sth)=@_;
     foreach my $str (@sql_sth){
          $str=~ s/;$//g;
    #     my $rec=$dbh->do($sth);
          my $sth=$dbh->prepare($str);
          my $rec=$sth->execute();
          if$str =~ /^\s+select/i){
                
               my $table=$sth->fetchall_arrayref();
               my($i,$j);
               if($str =~ /(is\s+null)$/i){     
                          
                    if($#{$table}>=0){
                         CITIC::showtime();print "主键含有null值,下面是SQL语句:$str\n以下是含有null值的数据:\n";
                         print "#" x 200 ."\n";
                         my $fields $sth->{NUM_OF_FIELDS}; #获得当前表的字段数
                         for(my $nu=0;$nu<$fields;$nu++){
                              my $col_name=$sth->{NAME}->[$nu]; #字段名称
                               #my $col_type=$sth->{TYPE}->[$i]; #字段类型
                               printf "%-30.35s","$col_name";
                         }
                         print "\n";
                         for $i (0..$#{$table}){
                              for $j (0..$#{$table->[$i]}){
                                   unlessdefined($table->[$i][$j])){
                                        $table->[$i][$j]="null" 
                                   }
                                   printf "%-30.35s","$table->[$i][$j]";
                              }
                              print "\n";
                              print "#" x 200 ."\n";
                         }
                         $sth->finish();
                         return 1;
                    }else{
                         CITIC::showtime();print "主键没有null值\n";
                    }
               }else{
                    if($#{$table}>=0){
                         CITIC::showtime();print "有重复数据,下面是SQL语句:$str\n以下是主键重复的数据\n";
                         print "#" x 200 ."\n";
                         my $fields $sth->{NUM_OF_FIELDS}; #获得当前表的字段数
                         for(my $nu=0;$nu<$fields;$nu++){
                              my $col_name=$sth->{NAME}->[$nu]; #字段名称
                               #my $col_type=$sth->{TYPE}->[$i]; #字段类型
                               printf "%-30.35s","$col_name";
                         }
                         print "\n";
                         for $i (0..$#{$table}){
                              for $j (0..$#{$table->[$i]}){
                                   unlessdefined($table->[$i][$j])){
                                        $table->[$i][$j]="null" 
                                   }
                                   printf "%-30.35s","$table->[$i][$j]";
                              }
                              print "\n";
                              print "#" x 200 ."\n";
                         }
                         $sth->finish();
                         return 1;
                    }else{
                         CITIC::showtime();print "没有重复数据\n";
                    }
               }
               $sth->finish();
          }
          unless($rec){
               #$dbh->rollback;
               CITIC::showtime(); print "excute error! \n".$dbh->errstr."\n";
               #CITIC::showtime(); print "-" x 15 . "语句执行失败!" ."-" x 15 ."\n"; 
               #CITIC::showtime(); print "$str\n" ;
               #CITIC::showtime(); print "-" x 15 . "SQL END" ."-" x 15 . "\n";
               $dbh->disconnect();
               return 1;
          }
          #$dbh->commit;
          #CITIC::showtime(); print "-" x 15 . "语句执行成功!" ."-" x 15 ."\n"; 
          CITIC::showtime(); print "$str\n";
          if($rec eq "0E0"){
               $rec=0;
          }
          CITIC::showtime(); print "#" x 15 ." is complete, 受影响的行数:$rec行"."#" x 15 . "\n";
          #CITIC::showtime(); print "#" x 15 . "受影响的行数:$rec行" ."#" x 15 . "\n"; 
          #CITIC::showtime(); print "-" x 15 . "SQL END" ."-" x 15 . "\n";
           
     }
 
     $dbh->disconnect();
     return 0;
}
 
#程序入口
sub main{
      
     my $ret;
     my $dbh;
     if (analyze_sqlfile($sqlfile)==1) {
          $ret = 1;
     }else{
   
     my %dbc_info=CITIC::get_dbc_info($TPMS_EOD_SID);
   
     unless (%dbc_info) {
               CITIC::showtime();print "Failed to get database information!\n";
   
     }else{
   
          $dbh=CITIC::connect_db($dbc_info{"ip"},$dbc_info{"port"},$dbc_info{"sid"},$dbc_info{"user"},$dbc_info{"pwd"});
   
     }
   
     unless($dbh){
   
          $ret = 1;
   
     }else{
   
          my @sql_queue=analyze_sqlfile($sqlfile);
   
          $ret=excute_sql($dbh,@sql_queue);
   
     }
     }
     print "return code is $ret\n";
     CITIC::close_logfile($log_file);
     return $ret;     
}
 
open(STDERR,">&STDOUT");
 
#if($ARGV[0] eq "error"){
#     $ARGV[0]=undef;
#}
if($#ARGV<0){
     print "Please input parameters,for example:\n1.tablename.sql\n";
     CITIC::close_logfile($log_file);
     exit(1);
}
 $sqlfile=$ARGV[0];
 
my $ret=main();
if($ret == 0){
     print STDOUT "complete";
}else{
     print STDOUT "fail";
}
exit($ret);
分享到:
评论

相关推荐

    java批量执行SQL

    ### Java批量执行SQL知识点解析 在Java开发过程中,经常需要与数据库进行交互,尤其是在处理大量数据时,如何高效地执行SQL语句变得尤为重要。本文将详细介绍如何利用Java进行批量SQL执行,包括其背景、实现原理、...

    批量执行SQL脚本

    批量执行SQL脚本的解决方案应运而生,它能够有效地自动化这个过程,提高工作效率,确保数据操作的一致性和准确性。下面,我们将深入探讨批量执行SQL脚本的核心知识点及其应用场景。 批量执行SQL脚本通常涉及到以下...

    批量执行SQL脚本(附源码).zip

    批量执行SQL脚本的能力对于开发者和DBA(数据库管理员)来说至关重要,尤其是在处理大量数据更新、表结构修改或数据迁移时。本文将深入探讨批量执行SQL脚本的原理以及提供的源码实现。 首先,批量执行SQL脚本通常...

    mysql批量执行sql文件批处理

    mysql 批量执行 sql文件 批处理,参数和执行方法见附件txt文档

    sqlplus中批量执行sql文件

    ### SQLPlus中批量执行SQL文件的方法 在日常的数据库管理工作中,经常需要对数据库进行批量操作,例如批量执行SQL脚本、更新存储过程等。在这些场景下,使用Oracle提供的命令行工具SQLPlus来批量执行SQL文件是一种...

    批量执行SQL server 脚本工具

    自动读取指定目录sql文件,科批量执行SQL server 脚本,fw4.0

    sqlserver 批量执行sql文件

    sqlserver 批量执行指定文件夹下面的sql文件。 非常快捷方便,使用于不同类型数据库之间的数据迁移

    SQL小工具 批量执行SQL脚本文件(WinForm开发 .Net 2.0)

    1、批量执行SQL脚本文件; 2、文件拷贝操作。 其中,App.config为工具配置文件, ;DataBase = master;User ID=sa; password="/&gt; 上述 ;DataBase = master;User ID=sa; password="/&gt;中,value的值为数据库...

    批量执行Sql脚本工具(含代码)

    因此,出现了批量执行Sql脚本的工具,如我们这里提到的"批量执行Sql脚本工具",它能有效提升工作效率,确保数据操作的一致性和准确性。该工具由作者自行编写,并提供了源码,这为用户提供了更多的定制化可能。 批量...

    批量执行SQL文件工具

    这时,“批量执行SQL文件工具”就显得尤为实用。这个工具专门设计用于批量处理SQL脚本,显著提升了数据库管理的工作效率。 批量执行SQL文件工具的主要功能包括: 1. **多文件处理**:工具允许用户一次性指定多个...

    连接sqlserver数据库,批量执行sql语句

    在本案例中,我们关注的是使用VC++和MFC(Microsoft Foundation Classes)库连接到SQL Server数据库并批量执行SQL语句的过程。下面将详细介绍这个过程涉及的关键知识点。 首先,`VC++`是微软开发的一款集成开发环境...

    TSQL_Express【批量执行SQL】批量执行sql文件工具

    TSQL_Express是一款专为数据库管理员和开发人员设计的工具,它允许用户批量执行SQL脚本,极大地提高了工作效率。批量执行SQL是数据库管理中的一个常见需求,特别是在数据迁移、更新或维护时。本文将深入探讨批量执行...

    SQL脚本批量执行,方便大量的SQL脚本执行。

    这时,批量执行SQL脚本的能力就显得尤为重要。本文将详细探讨如何进行SQL脚本的批处理执行,并提供相关策略和工具。 首先,了解批处理的基本概念。批处理是指将一系列命令或操作组合在一起,一次性执行,以提高工作...

    批量执行sql文件

    批量执行 SQL 文件 在系统升级时,需要批量执行大量的 SQL 文件,这是一个繁琐的工作。为了简化这个过程,我们可以使用 osql/ocmd 命令或 master..xp_cmdshell 存储过程来批量执行 SQL 文件。 一、准备工作 首先...

    数据库操作中如何批量执行sql文件导出对应sql文件名

    数据库操作中如何批量执行sql文件导出对应sql文件名数据库操作中如何批量执行sql文件导出对应sql文件名

    批量执行sql脚本文件,支持oracle、sql server2005

    批量执行sql脚本的web工程,通过myeclipse导入工程即可,经过测试可以批量导入oracle与sql server2005的脚本,而且是web页面的向导式执行*.sql脚本文件 支持事务,任何执行过程出现异常,均会提示并且回滚操作,页面...

    批量执行SQL SERVER脚本 Python脚本

    Python脚本,批量执行数据库脚本,适用于SQL Server数据库,后续会上传MySQL的批量执行sql脚本

    E_Sql.rar_执行sql_批量执行SQL

    "E_Sql.rar_执行sql_批量执行SQL" 这个压缩包文件显然提供了批量执行SQL脚本的功能,这对于数据库管理员、开发人员以及数据分析师来说是非常实用的工具。让我们深入探讨一下这个主题。 批量执行SQL意味着能够一次...

    批量执行Sql.bat

    标题“批量执行Sql.bat”指的是一个批处理文件,用于自动化执行SQL命令。这种工具在数据库管理、数据迁移或脚本测试等场景中非常有用。它能够显著提高工作效率,特别是当需要对一系列SQL语句进行重复操作时。 描述...

Global site tag (gtag.js) - Google Analytics