perl unload utf-8 oracle Wide character in print at unload_oracle.pl line 105.

#!/usr/bin/perl 
use DBI;
use Encode;
my $dbName = 'oadb';
my $dbUser = 'vxspace';
my $dbUserPass = 'xxx';
my $dbh = DBI->connect("dbi:Oracle:$dbName", $dbUser, $dbUserPass) or die "can't connect to database ";
my $table_name= "$ARGV[0]"; 
my $hostSql = qq{select COLUMN_NAME from dba_tab_columns where table_name='$table_name'};
my $UNLOAD_SRC_DBCONN = DBI->connect("DBI:Oracle:".$dbName,$dbUser,$dbUserPass) or die("DB connect error!n");
my $DW_DATA_DT ="";
my $datafile="$table_name.TXT";
use HTTP::Date qw(time2iso str2time time2iso time2isoz);
my @lstRlst;
my ($COLUMN_NAME);
my $selStmt = $dbh->prepare($hostSql);
$selStmt->bind_columns(undef, \$COLUMN_NAME);
$selStmt->execute();
while( $selStmt->fetch() ){
  print "$COLUMN_NAME\n";
push  (@lstRlst1 ,$COLUMN_NAME);
  }
  $selStmt->finish;
  $dbh->disconnect;
my @lstRlst = reverse (@lstRlst1);
##########################################
#=================全局变量区==========================#
if ($#ARGV <0){
        print "请输入一个表名参数";
        exit(-1);
    }
sub printlog
{
  my ($LogInfo)= @_;
  my $CurrTime = time2iso(time());                   # 当前时间
  if(!defined($LogInfo) ){$LogInfo="";}
  my $StrLog="【${CurrTime}】 \t ${LogInfo} \n"; 
  
  print $StrLog;
  #print LOGFILE $StrLog;
  }
  
my $exportOracleSql="SELECT ";  #数据导出的sql
for (my $m=0;$m<@lstRlst + 0 ;$m++){
 if  ($m != @lstRlst + 0 - 1){
  $exportOracleSql = "$exportOracleSql trim($lstRlst[$m])".", "
}
else{
$exportOracleSql = "$exportOracleSql trim($lstRlst[$m])"}
print "$exportOracleSql\n";
}
my $exportOracleSql="$exportOracleSql from $dbUser.$table_name";

sub Exportdata{
	    printlog "开始导出数据!";
	    my $exportsql=$exportOracleSql;
	    if($exportsql eq "error"){
	    	return -1;
	    	}
	    my $format_sql="alter session set nls_date_format='yyyy-mm-dd'";
	    my $stmt=$UNLOAD_SRC_DBCONN->prepare($format_sql);
	    unless ($stmt){
			printlog "\n执行prepare SQL语句出错:\n";
			printlog $DBI::errstr; 
			return -1;
			}
			$stmt->execute;
			if ($UNLOAD_SRC_DBCONN->err) {
			printlog "\n执行SQL语句出错:\n"; 
			printlog $DBI::errstr;
			return -1;
			}
	     $stmt=$UNLOAD_SRC_DBCONN->prepare($exportsql);
	    unless ($stmt){
			printlog "\n执行prepare SQL语句出错:\n";
			printlog $DBI::errstr;
			return -1;
		}
	       $stmt->execute;
		if ($UNLOAD_SRC_DBCONN->err) {
			printlog "\n执行SQL语句出错:\n"; 
			printlog $DBI::errstr;
			
			return -1;
		}
	     my $row=0;
	     my $size=0;
	     my $curtime;

	     
	     
	     my $writeflagsql;
	     my $tmpstr="";
	     $row=0;
	     my $m=0;              
 open(DATAFILE,">", $datafile) || die (print "Open DATA file failed!!!\n");
	     while(my $Rows = $stmt->fetchrow_arrayref){
	     	$m=0;
	     	$tmpstr="";
	     	foreach(@$Rows){
	     		$tmpstr=$tmpstr.$Rows->[$m]."|";
	     		$m++;
	     	}
	     	#print DATAFILE encode_utf8($tmpstr.$DW_DATA_DT)."\n";
	     	print DATAFILE $tmpstr.$DW_DATA_DT."\n";
	     	$row++;
	     	if(($row%10000) == 0){
	     		printlog "已导出数据$row条!";
	     	}	     	     	
	    }
     	
        	$stmt->finish;
        #	print FLAGFILE $datafile,"\n";
        #	print FLAGFILE $row,"\n";
        	close(DATAFILE);
        #  close(FLAGFILE);

        	$curtime=time2iso(time());
          printlog "数据已成功导出!";
          printlog "一共导出数据${row}条";
                
          return 1;	
	
	}
Exportdata


Wide character in print at unload_oracle.pl line 105.
Wide character in print at unload_oracle.pl line 105.
Wide character in print at unload_oracle.pl line 105.
【2016-11-17 19:02:25】 	 数据已成功导出! 
【2016-11-17 19:02:25】 	 一共导出数据3726条 


需要encode_utf8($tmpstr.$DW_DATA_DT)."\n";

posted @ 2016-11-17 19:03  czcb  阅读(198)  评论(0编辑  收藏  举报