2012-10-10 130 views
0

我在Java代碼中調用一個存儲過程,它使用Sybase數據庫如下:的Java存儲過程不執行

CallableStatement cstmt=sigmaConnection.prepareCall("{call dbo.sp_insRadEntry(?, ?, ?, ?, ?, ?, ?)}"); 
cstmt.setString(1,"Nappa"); 
cstmt.setInt(2,40); 
cstmt.setString(3,"Vegeta"); 
cstmt.setString(4,"Saiyan"); 
cstmt.setString(7,"Hello"); 

cstmt.execute(); 

正如你可以看到我有故意不設置第5和第6個參數作爲我的存儲過程具有默認值,如果任何值沒有通過,並在此調用dbo.sp_insRadEntry(?,?,?,?,?,?,?)我有7個參數,因爲它不允許我設置第7個參數沒有在這裏有7個逗號。

但我發現了以下異常,即使我已經設置了4個參數:

「值java.sql.SQLException:JZ0SA:準備語句:未設置輸入參數,指數:4」

+0

您可以發佈CREATE PROCEDURE語句的頂部(與變量,默認值等) – Hotel

回答

0

它看起來像'索引4'是指第五個參數(索引是從零開始的),所以我認爲問題是默認參數沒有被您的代碼識別。

+0

但我只使用在存儲proc.So規定如何修改默認值我的代碼,以便只使用存儲的proc中指定的值。 –

0

您應該嘗試使用setNull方法設置缺少的第5和第6個參數。

+0

也嘗試過,但它給出了另一個異常,說「列不允許空值」 –

+0

您是否嘗試過使用setNull(5,your5thColumnType)方法? – dan

+0

是的,也試過了。返回空值不允許的異常。 –

0

您需要在指標設定值5 & 6也

int type = TYPE 
pst.setNull(index, type); 

對於TYPE參考這裏:http://www.tutorialspoint.com/jdbc/jdbc-data-types.htm

編輯:如果您還沒有空約束,你有沒有辦法,只能設置一些假或者在讀取數據時你會忽略的那些位置上的空白值(如:爲該檢查寫一些額外的代碼),如果你真的不想這樣做,那麼爲什麼你在第一個位置設置了非空限制的。 :-)

+0

我試過foll,它仍然返回一個異常,因爲不允許空值。 'cstmt.setNull(5,java.sql.Types.CHAR); cstmt.setNull(6,java.sql.Types.VARCHAR);' –

+0

@gautamvegeta檢查你的數據庫表是否對第5列和第6列有任何'not null'約束。 –

+0

是的,它確實有這些約束。但這就是爲什麼在我的存儲過程中,我提到了默認參數。所有我想要做的就是在java中存儲的proc調用中跳過該參數。 –

0

我不確定這可以在你的數據庫中工作,但是如何省略你不想指定的參數的問號?那就是:

CallableStatement cstmt=sigmaConnection.prepareCall(
     "{call dbo.sp_insRadEntry(?, ?, ?, ?, , , ?)}"); 
cstmt.setString(1,"Nappa"); 
cstmt.setInt(2,40); 
cstmt.setString(3,"Vegeta"); 
cstmt.setString(4,"Saiyan"); 
cstmt.setString(5,"Hello"); 

cstmt.execute();