2017-08-03 112 views
-3
#! /usr/bin/perl 

use DBI; 
use strict; 
use Data::Dumper; 

my $dbh = DBI->connect("DBI:DB2:xxx",'xxx','xxx',{ RaiseError => 0, AutoCommit => 1 }) 
or die ("Could not connect to database :".DBI->errstr); 

my %hash = 
(
'2017-01-01 00:00:00' => '2017-01-31 00:00:00', 
'2017-02-01 00:00:00' => '2017-02-28 00:00:00', 
'2017-03-01 00:00:00' => '2017-03-31 00:00:00', 
'2017-04-01 00:00:00' => '2017-04-30 00:00:00', 
'2017-05-01 00:00:00' => '2017-05-31 00:00:00', 
'2017-06-01 00:00:00' => '2017-06-30 00:00:00', 
'2017-07-01 00:00:00' => '2017-07-31 00:00:00', 
'2017-08-01 00:00:00' => '2017-08-31 00:00:00', 
'2017-09-01 00:00:00' => '2017-09-30 00:00:00' 
); 

#open(my $fh , "+>/var/www/bin/filesample.txt"); 

foreach my $key(sort keys %hash) { 
    chomp($key); 
    #my $sql = "select distinct FID_CUST from session where DAT_END between ? and ?"; 
    my $sql = "select distinct FID_CUST from session where DAT_END between TIMESTAMP(?) and TIMESTAMP(?)"; 
    print "\$sql = $sql\n"; 
    my $sth = $dbh->prepare($sql); 
    $sth->execute($key,$hash{$key}) or die "Couldn't execute statement: $DBI::errstr"; 
    print "sth: $sth\n"; 

    while (my $arr = $sth->fetchrow_arrayref()){ 
    print "in while\n"; 
    print "@$arr\n"; 
    } 
    $sth->finish(); 
} 
#close FH; 
$dbh->disconnect; 

在這裏,我不能得到什麼是錯的代碼,因爲控制不會去循環。請建議可以做些什麼。我正在使用DB2數據庫。我沒有收到任何錯誤,但它不會顯示任何輸出。我用佔位符也使用了TIMESTAMP,但它顯示了一些模糊性錯誤。無法解析代碼中的日期和流程是不會去while循環

+5

「出一些模糊的錯誤。」 ??? –

+2

缺少'使用警告;'。 – melpomene

+0

DBD :: DB2 :: db準備失敗:[IBM] [CLI驅動程序] [DB2/AIX64] SQL0245N例程「TIMESTAMP」的調用不明確。位置「1」的論點並不適合。 SQLSTATE = 428F5 DBD :: DB2 :: st執行失敗:[IBM] [CLI驅動程序] [DB2/AIX64] SQL0245N例程「TIMESTAMP」的調用不明確。位置「1」的論點並不適合。SQLSTATE = 428F5 無法運行:[IBM] [CLI Driver] [DB2/AIX64] SQL0245N例程「TIMESTAMP」的調用不明確。位置「1」的論點並不適合。 SQLSTATE = 428F5 –

回答

1

documentation for TIMESTAMP說:

字符串或圖形字符串與14的實際長度表示形式yyyyxxddhhmmss,其中yyyy是一年有效的日期和時間,xx是一個月,dd是當天,hh是小時,mm是分鐘,而ss是秒數。

您正在傳遞實際長度爲19的字符串,如'2017-01-01 00:00:00'

傳遞時間戳以DB2期望的方式格式化,例如, 20170101000000

如果沒有工作,然後嘗試在DB2 documentation for error SQL0245N

當一個函數的調用不明確時返回此錯誤給出的建議。這發生在有兩個或多個可能的候選函數滿足函數解析的標準時。

...

用戶響應

更改SQL語句的參數顯式轉換爲所需的數據類型,函數的定義,或SQL路徑刪除從模糊一組候選功能,然後重試。

,改變你的查詢:

select distinct FID_CUST 
from session 
where DAT_END between 
    TIMESTAMP(cast(? as TIMESTAMP)) and 
    TIMESTAMP(cast(? as TIMESTAMP)) 

或相似。

正如我所說,你的問題沒有任何Perl內容。如果我編制的用於將字符串轉換爲TIMESTAMP的語法不正確,請向數據庫管理員提供正確的DB2 SQL語法。

+0

看起來你沒有Perl問題。 –

+0

哦,真的!再次感謝。 –

+0

您發佈的唯一錯誤消息是數據庫發出的錯誤消息。 –

1

更改所有的時間戳文字從目前的格式

'2017-01-01 00:00:00' => '2017-01-31 00:00:00', 

'2017-01-01-00.00.00.000000' => '2017-01-31-00.00.00.000000',