2008-11-06 9 views
1

매우 간단한 Perl 프로세스에 문제가 있습니다. 기본적으로 Oracle 데이터베이스를 쿼리하고 Excel로로드하려고합니다. DBIx :: Dump를 사용할 수 있었고 작동합니다. 그러나 다양한 Excel 서식 도구를 사용할 수 있어야합니다. 그리고 나는 Spreadsheet::WriteExcel이 더 많은 서식을 지정할 수 있도록 Excel로 출력하는 가장 좋은 모듈이라고 생각합니다.Perl의 DBI를 사용하여 Oracle에서 Excel로 날짜 값을 변환하려면 어떻게해야합니까?

아래 코드와 오류가 있습니다. 기본적으로 오라클에 쿼리하고, 데이터를 가져오고, 배열로로드하고, 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(); 
+0

@ 툴킷, 정리해 주셔서 감사합니다. –

+0

IT 부서는 앞으로 문제를 설명하는 가장 작은 프로그램을 만들 수 있도록 도와 줄 수 있습니다. 그것은 당신이 정확하게 문제를 일으키는 원인이되고 사람들이 당신을 도울 수있게 도와줍니다. :) –

답변

3

나는 그것이 문자열로 나오는 것을 생각하고 날짜 컬럼에 삽입하려고 할 때, 어떤 암시가 없을 것 그것을위한 변환.

이렇게 날짜를 선택하면 비교할 수있는 문자로 바뀝니다.

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

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

은 삽입에 날짜로 다시 변환합니다. 이것이 일반적으로 SQL에서해야 할 일입니다.

필자가 기억 하듯이 perl에는 DBI에 대한 추적 기능이있어 상황에 대해보다 나은 그림을 제공 할 수 있습니다.

+0

질문을주의 깊게 읽은 후에 정확한 문맥을 놓칠 수 있습니다. 잘 완료 jmcnamara – EvilTeach

4

문제는 여기에 있습니다 :

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

write()에 대한 올바른 구문은 다음과 같습니다

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

당신은이 경우에 아마 0

하는 경우입니다 $column 인수를 누락 $stmt은 다음과 같이 배열 참조로 쓸 수 있습니다.

$worksheet->write($row++, 0, $stmt); 
관련 문제