#!/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]}){
unless
(
defined
(
$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]}){
unless
(
defined
(
$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执行,包括其背景、实现原理、...
批量执行SQL脚本的解决方案应运而生,它能够有效地自动化这个过程,提高工作效率,确保数据操作的一致性和准确性。下面,我们将深入探讨批量执行SQL脚本的核心知识点及其应用场景。 批量执行SQL脚本通常涉及到以下...
批量执行SQL脚本的能力对于开发者和DBA(数据库管理员)来说至关重要,尤其是在处理大量数据更新、表结构修改或数据迁移时。本文将深入探讨批量执行SQL脚本的原理以及提供的源码实现。 首先,批量执行SQL脚本通常...
mysql 批量执行 sql文件 批处理,参数和执行方法见附件txt文档
### SQLPlus中批量执行SQL文件的方法 在日常的数据库管理工作中,经常需要对数据库进行批量操作,例如批量执行SQL脚本、更新存储过程等。在这些场景下,使用Oracle提供的命令行工具SQLPlus来批量执行SQL文件是一种...
自动读取指定目录sql文件,科批量执行SQL server 脚本,fw4.0
sqlserver 批量执行指定文件夹下面的sql文件。 非常快捷方便,使用于不同类型数据库之间的数据迁移
1、批量执行SQL脚本文件; 2、文件拷贝操作。 其中,App.config为工具配置文件, ;DataBase = master;User ID=sa; password="/> 上述 ;DataBase = master;User ID=sa; password="/>中,value的值为数据库...
因此,出现了批量执行Sql脚本的工具,如我们这里提到的"批量执行Sql脚本工具",它能有效提升工作效率,确保数据操作的一致性和准确性。该工具由作者自行编写,并提供了源码,这为用户提供了更多的定制化可能。 批量...
这时,“批量执行SQL文件工具”就显得尤为实用。这个工具专门设计用于批量处理SQL脚本,显著提升了数据库管理的工作效率。 批量执行SQL文件工具的主要功能包括: 1. **多文件处理**:工具允许用户一次性指定多个...
在本案例中,我们关注的是使用VC++和MFC(Microsoft Foundation Classes)库连接到SQL Server数据库并批量执行SQL语句的过程。下面将详细介绍这个过程涉及的关键知识点。 首先,`VC++`是微软开发的一款集成开发环境...
批量执行SQL脚本是数据库管理员、开发人员和数据分析师经常遇到的需求,这涉及到大量SQL命令的自动化处理,以提高效率并减少手动操作的错误。"SqlScriptHelper"是一个专门为此目的设计的小型工具,它允许用户方便地...
这时,批量执行SQL脚本的能力就显得尤为重要。本文将详细探讨如何进行SQL脚本的批处理执行,并提供相关策略和工具。 首先,了解批处理的基本概念。批处理是指将一系列命令或操作组合在一起,一次性执行,以提高工作...
TSQL_Express是一款专为数据库管理员和开发人员设计的工具,它允许用户批量执行SQL脚本,极大地提高了工作效率。批量执行SQL是数据库管理中的一个常见需求,特别是在数据迁移、更新或维护时。本文将深入探讨批量执行...
批量执行 SQL 文件 在系统升级时,需要批量执行大量的 SQL 文件,这是一个繁琐的工作。为了简化这个过程,我们可以使用 osql/ocmd 命令或 master..xp_cmdshell 存储过程来批量执行 SQL 文件。 一、准备工作 首先...
批量执行sql脚本的web工程,通过myeclipse导入工程即可,经过测试可以批量导入oracle与sql server2005的脚本,而且是web页面的向导式执行*.sql脚本文件 支持事务,任何执行过程出现异常,均会提示并且回滚操作,页面...
数据库操作中如何批量执行sql文件导出对应sql文件名数据库操作中如何批量执行sql文件导出对应sql文件名
Python脚本,批量执行数据库脚本,适用于SQL Server数据库,后续会上传MySQL的批量执行sql脚本
首先,让我们详细了解一下批量执行SQL脚本的重要性。在数据库维护或更新过程中,经常需要运行一系列SQL命令来创建表、索引、视图、存储过程等,或者执行数据迁移和更新操作。手动逐一执行这些脚本不仅耗时,还容易...