2016-05-16 207 views
0

我試圖從Perl腳本連接到Oracle數據庫並從中獲取輸出。我寫了下面的代碼Oracle數據庫語句執行失敗

#!/usr/local/bin/perl 

use DBI; 
use warnings; 
use strict; 

sub retrieve_data { 
    my ($dbh, $rwnum) = @_; 
    my @row; 
    my $selstmt = $dbh->prepare("select * from DIT_NOFUTURE_TMP1 where rownum < 5") 
      or die "Can't prepare SQL statement: ", $dbh->errstr(), "\n"; 
    $selstmt->execute($rwnum); 
    while (@row = $selstmt->fetchrow_array) { # retrieve one row 
     print join(", ", @row), "\n"; 
    } 
} 

my $dsn = "dbi:Oracle:DBInstance"; 
my $dbh = DBI->connect($dsn, 'username', 'password', { AutoCommit => 0 }); 
my $rno = 5; 

unless ($dbh) { 
    print "\nError : DBI connect failed: DBI:errstr\n"; 
    print "Error : Unable to connect to database $dsn\n"; 
    exit(-1); 
} 

retrieve_data $dbh , $rno; 

exit(0); 

預期輸出:

SQL> select * from DIT_NOFUTURE_TMP1 where rownum < 5; 

ORDER_ID ORDER_UNIT CUSTOMER_ID 
---------- ---------- -------------- 
2534  2535  100000046 
2560  2561  100000109 
2523  2524  100000045 
2525  2526  100000045 

輸出接收:

DBD::Oracle::st execute failed: called with 1 bind variables when 0 are needed [for Statement "select * from DIT_NOFUTURE_TMP1 where rownum<5"] at dbcon.pl line 13. 
DBD::Oracle::st fetchrow_array failed: ERROR no statement executing (perhaps you need to call execute first) [for Statement "select * from DIT_NOFUTURE_TMP1 where rownum<5"] at dbcon.pl line 14. 
Issuing rollback() due to DESTROY without explicit disconnect() of DBD::Oracle::db handle (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=135.208.32.97)(PORT= 1521))(CONNECT_DATA =(SERVER=DEDICATED)(SERVICE_NAME=PRDMOMS))) at dbcon.pl line 36. 

請建議一些這方面的解決方案。

回答

5

如錯誤所示,您的語句句柄不會期望任何參數(因爲在查詢中沒有佔位符)。

如果號碼5應該通過參數來代替,只是改變了查詢

my $selstmt = $dbh->prepare('select * from DIT_NOFUTURE_TMP1 where rownum < ?') 
    or die "Can't prepare SQL statement: ", $dbh->errstr(), "\n"; 

否則,刪除參數:

$selstmt->execute; 
+0

我試圖消除參數及其工作正常...謝謝 –