我正在从结果集中读取每一行(多维数组,因为行和列是动态的),并修改数组中特定位置的所有日期字段的格式。但是这需要花费很多时间,因为结果集会返回更多行。
下面是我用来更改行级别的示例代码,是否有可能使用regexp更改数组中的整列值?还是以其他方式来改进这个计划?
$sth = $dbh->prepare( "BEGIN TESTPROC(?, ?, ?); END;" );
$sth->bind_param( 1, 'GMS_JOB_NAME' );
$sth->bind_param_inout( 5, \$ResultSet, 0, { ora_type => ORA_RSET } );
$sth->bind_param_inout( 6, \$out_date, VARCHAR2 );
unless ( $sth->execute() ) {
print "Couldnt be invoked";
}
my $temp_file = "/user/test.csv";
my $i = 0;
my $flag = 0;
my @type;
my @precision;
my @date_type;
if ( $flag == 0 ) {
$j = 0;
while ( $i < $num_fields ) {
$type[$i] = $ResultSet->{TYPE}->[$i];
$precision[$i] = $ResultSet->{PRECISION}->[$i];
if ( $type[$i] == 93 and $precision[$i] == 75 ) {
$date_type[$j] = $i;
$j = $j + 1;
}
$i = $i + 1;
}
$flag = 1;
}
$i = 0;
if ( $out_date ) {
unless ( open( FH, '>>', "$temp_file" ) ) {
print "Unable to open the Report file $temp_file";
}
$file_check = 1;
my $num_fields = $ResultSet->{NUM_OF_FIELDS};
while ( @record = $ResultSet->fetchrow_array ) {
$record_flag = 1;
foreach $k ( @date_type ) {
if ( defined $record[$k] ) {
my $pos = rindex( $record[$k], "." );
$record[$k] =~ s/\./:/g;
if ( $pos ne -1 ) {
substr( $record[$k], $pos, 1 ) = ".";
}
my $dt = `date -d"$record[$k]" +"%d-%b-%Y"`;
chomp( $dt );
$dt = uc $dt;
$record[$k] = $dt;
}
}
if ( index( $record[0], "\"" ) eq -1 ) {
my $data = join( '","', @record );
$data = '"' . $data . '"';
}
}
$dbh->commit();
$sth->finish();
$ResultSet->finish();
以下是包含10列和7行的示例数据。这将从数据库中检索到数组$ResultSet
,空格为分隔符。
结果集不限于此行数和列数;它可能在数千列中有数百万行。
根据以下数据,我想更改结果集中第3,4和5列中所有值的日期格式。当前的方法是逐行进行并将其写入CSV文件,但这很慢。
还有更好的选择吗?
1 A 2014/09/09 2014/09/09 2014/09/09 AMETIC NONRRA 1 122121 1212.432
2 b 2014/09/09 2014/01/09 2014/09/09 AMETIC NONRRA 1 122121 1212.432
3 B 2014/09/09 2014/04/09 2014/09/09 AMETIC NONRRA 1 122121 1212.432
4 R 2014/09/09 2014/05/09 2014/09/09 AMETIC NONRRA 1 122121 1212.432
5 G 2014/09/09 2014/07/09 2016/09/09 AMETIC NONRRA 1 122121 1212.432
6 DD 2014/09/09 2015/03/09 2014/09/09 AMETIC NONRRA 1 122121 1212.432
7 DSSS 2014/09/09 2015/09/06 2015/09/09 AMETIC NONRRA 1 122121 1212.432