2016-04-18 58 views
0

我試圖執行一個存儲過程,並且(現在)獲取返回的行數。 但我不斷收到以下錯誤:Perl - 如何調用Oracle DB存儲過程

DBD::Oracle::st execute failed: ORA-00900: invalid SQL statement (DBD ERROR: OCI 
StmtExecute) [for Statement "exec VSU22.DB_API.GetUsersInfo(?);" with ParamValue 
s: :p1=1] at C:\NNInstall\auit.pl line 19. 

這裏是腳本:

#!/usr/bin/perl 
use strict; 
use dbi; 

my ($connection_string, $nn_dbh, $extract_sth); 
my $dbIPAddress = "192.168.147.55"; 
my @row; 
my $query_result=0; 
my $var; 
$connection_string = "dbi:Oracle:host=$dbIPAddress;sid=NNVSDB"; 
$nn_dbh->{RaiseError} = 1; 
$nn_dbh->{RowCacheSize} = 256; 
$nn_dbh = DBI->connect($connection_string, 'DBSUER', 'DBUSER') 
    or die "Connection failed: $DBI::errstr"; 

$extract_sth = $nn_dbh->prepare('exec DBUSER.API.UsersInfo(?);'); 
$extract_sth ->bind_param(1, 1); 
my $num_ofOrows= $extract_sth->execute(); 

我到底做錯了什麼?

+1

1.您是否知道存儲過程正確執行?你在Oracle中測試過嗎? 2.如果是這樣,你知道該參數是否以期望的格式傳遞嗎?你可以讓proc輸出創建的sql語句到控制檯或臨時表來驗證sql語句是否正在構建正確的存儲過程? 3.發佈存儲的proc代碼也是有用的。 –

+0

1.是的。 2.期望的參數類型是NUMBER。 3.我無法發佈程序代碼。 –

+0

好的。我會找到一種方法來輸出在sp上創建的sql來查看該語句是否失敗。如果沒有,那麼它的通話失敗 - 但至少你知道在哪裏尋找。 –

回答

1

EXEC[CUTE]SQL*Plus command。它通常不在其他SQL客戶端中實現。您可能需要使用匿名PL/SQL塊;

BEGIN 
    DBUSER.API.UsersInfo(?); 
END; 
+0

我應該如何處理'CALL DBUSER.API.USERSINFO(?);' ? –

+0

我相信'CALL'也是一個有效的選項 - http://ss64.com/ora/call.html –

+0

但是我得到的錯誤呢?我已經添加了BEGIN&END,但我得到了同樣的錯誤。 –