Как я могу перевести значения даты из Oracle в Excel, используя Perl DBI? - PullRequest
1 голос
/ 06 ноября 2008

У меня проблемы с очень простым Perl-процессом. Я в основном запрашиваю базу данных Oracle и хочу загрузить ее в Excel. Я был в состоянии использовать DBIx :: Dump, и он работает. Однако мне нужно иметь возможность использовать различные инструменты форматирования Excel. И я думаю, Spreadsheet :: WriteExcel - лучший модуль для вывода в Excel, который позволяет мне больше форматировать.

Ниже приведен код и ошибка, которую я получаю. Я в основном запрашиваю Oracle, извлекаю данные, загружаю в массив и пытаюсь записать в Excel. По какой-то причине он делает какое-то сравнение и ему не нравятся типы данных. Например, дата «25 -OCT-08». SVP - это «S01». Кажется, говорят, что они не числовые.

Ошибка:

Argument "01-NOV-08" isn't numeric in numeric ge <>=> at C:/Perl/site/lib/Spreadsheet/WriteExcel/Worksheet.pm line 3414.
Argument "01-NOV-08" isn't numeric in pack ge <>=> ge <>=> at C:/Perl/site/lib/Spreadsheet/WriteExcel/Worksheet.pm line 2157.

Код:

#!/usr/bin/perl -w 

#Set the Perl Modules
use strict; 
use DBI;
use Spreadsheet::WriteExcel;


# Connect to the oracle database
my $dbh = DBI->connect( 'dbi:Oracle:xxxx',
                        'xxxx',
                        'xxxx',
                      ) || die "Database connection not made: $DBI::errstr";


#Set up Query
my $stmt = "select 
                                   week_end_date, SVP, RD,
                                    DM, store, wtd_smrr_gain,QTD_SMRR_GAIN,
                                   wtd_bor_gain,QTD_BOR_GAIN,
                                   wtd_cust_gain,QTD_CUST_GAIN,
                                   wtd_CARD_CLOSED_OCT25,QTD_AVG_CARD_CL
                    from 
                          bonus_4Q_store
                    order by
                          store"; 

#Prepare Query
my $sth = $dbh->prepare($stmt); 

#Execute Query
$sth->execute() or die $dbh->errstr; 

my( $week_end_date,$SVP,$RD,$DM,$store,
    $wtd_smrr_gain,$QTD_SMRR_GAIN,
    $wtd_bor_gain,$QTD_BOR_GAIN,
    $wtd_cust_gain,$QTD_CUST_GAIN,
    $wtd_CARD_CLOSED_OCT25,$QTD_AVG_CARD_CL);

#binds each column to a scalar reference
$sth->bind_columns(undef,\$week_end_date,\$SVP,\$RD,\$DM,\$store,
                   \$wtd_smrr_gain,\$QTD_SMRR_GAIN,
                   \$wtd_bor_gain,\$QTD_BOR_GAIN,
                   \$wtd_cust_gain,\$QTD_CUST_GAIN,
                   \$wtd_CARD_CLOSED_OCT25,\$QTD_AVG_CARD_CL,);

#create a new instance
my $Excelfile = "/Test_Report.xls"; 
my $excel = Spreadsheet::WriteExcel->new("$Excelfile"); 
my $worksheet = $excel->addworksheet("WOW_SHEET");

#Create array shell
my @data;

#Call data and Write to Excel  
while ( @data = $sth->fetchrow_array()){ 
    my $week_end_date = $data[0]; 
    my $SVP = $data[1]; 
    my $RD = $data[2]; 
    my $DM = $data[3]; 
    my $store = $data[1]; 
    my $wtd_smrr_gain = $data[2]; 
    my $QTD_SMRR_GAIN = $data[3];
    my $wtd_bor_gain = $data[4];
    my $QTD_BOR_GAIN = $data[5];
    my $wtd_cust_gain = $data[6];
    my $QTD_CUST_GAIN = $data[7];
    my $wtd_CARD_CLOSED_OCT25 = $data[8];
    my $QTD_AVG_CARD_CL = $data[9];
    my $row = 0; 
    my $col = 0; 
    foreach my $stmt (@data) 
    { 
        $worksheet->write($row++, @data); 
        last; 
    } 
} 

print "DONE \n"; 
$sth->finish(); 
$dbh->disconnect();

Ответы [ 2 ]

4 голосов
/ 07 ноября 2008

Проблема здесь:

foreach my $stmt (@data) 
{ 
    $worksheet->write($row++, @data); # !!
    last; 
} 

Правильный синтаксис для write():

write($row, $column, $token, $format)

Вам не хватает аргумента $column, который в данном случае, вероятно, равен 0.

Если $stmt - ссылка на массив, вы можете написать его за один раз:

$worksheet->write($row++, 0, $stmt); 
3 голосов
/ 06 ноября 2008

Я бы предположил, что он выходит в виде строки, и когда вы пытаетесь вставить его в столбец даты, для него нет явного преобразования.

Попробуйте выбрать такую ​​дату, и она превратится в символ, который вы можете использовать для сравнения.

to_char(date, 'YYYY/MM/DD HH24:MI:SS')

затем

to_date(date, 'YYYY/MM/DD HH24:MI:SS') 

чтобы преобразовать его обратно в дату при вставке. Обычно это то, что вам нужно делать в SQL.

Насколько я помню, в Perl есть средство трассировки для DBI, которое может дать лучшую картину происходящего.

...