2008-11-06 24 views
1

J'ai des problèmes avec un processus Perl très simple. Je demande fondamentalement une base de données d'Oracle et je veux le charger dans Excel. J'ai été capable d'utiliser DBIx :: Dump et ça marche. Cependant, je dois être en mesure d'utiliser une variété d'outils de formatage Excel. Et je pense que Spreadsheet::WriteExcel est le meilleur module qui sort à Excel qui me permet de faire plus de mise en forme.Comment puis-je traduire les valeurs de date d'Oracle en Excel à l'aide de DBI de Perl?

Voici le code et l'erreur que j'obtiens. Je interroge fondamentalement Oracle, récupère les données, charge dans un tableau et essaye d'écrire dans Excel. Pour une raison quelconque, il fait une sorte de comparaison et il n'aime pas les types de données. Par exemple, la date est '25 -OCT-08 '. Le SVP est 'S01'. Il semble dire qu'ils ne sont pas numériques.

Erreur:

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. 

code:

#!/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(); 
+0

@toolkit, merci pour le nettoyage. –

+0

Il pourrait vous aider dans le futur à faire le plus petit programme possible qui illustre le problème. Il vous montre exactement ce qui cause le problème et le rend plus facile pour les gens de vous aider :) –

Répondre

3

Je suppose que cela vient comme une chaîne, et quand vous essayez de l'insérer dans la colonne de date, il n'y a pas implicite conversion pour cela.

Essayez de sélectionner la date comme ceci, et il le transformera en un caractère que vous pouvez utiliser pour faire des comparaisons.

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

puis

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

pour le reconvertir à une date à insérer. C'est généralement ce que vous devez faire en SQL. Si je me souviens bien, perl a une fonction de trace pour DBI qui pourrait donner une meilleure image de ce qui se passe.

+0

Il ne cesse de m'étonner, qu'après une lecture attentive de la question, je manque complètement le bon contexte. Bien fait jmcnamara – EvilTeach

4

Le problème est ici:

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

La syntaxe correcte pour write() est:

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

Il vous manque l'argument $column, qui dans ce cas est probablement 0.

Si $stmt est un tableau ref puis vous pouvez l'écrire en une seule fois comme suit:

$worksheet->write($row++, 0, $stmt);