2012-08-09 58 views
4

如果您只想設置某些參數,那麼使用JDBC調用存儲過程的最佳方式是什麼?如何在JDBC中調用存儲過程僅設置某些參數

如果我只是使用SQL,我可以在SQL中通過名稱設置參數以調用存儲過程。例如。如果我有九個參數的存儲過程,我想設置參數1,2和9,留下其餘爲默認值,我可以運行該SQL:

exec my_stored_procedure 
    @parameter_1  = "ONE", 
    @parameter_2  = "TWO", 
    @parameter_9  = "NINE" 

使用JDBC(具體的jConnect 6.0)看起來在使用CallableStatement時,您必須通過整數索引來設置參數,而不是它們的名稱。如果我嘗試創建上面的存儲過程一個CallableStatement,有9個參數,只設置參數1,2和9,像這樣:

myStoredProcedureCall = 
    sybConn.prepareCall("{call my_stored_procedure (?, ?, ?, ?, ?, ? , ?, ?, ?)}"); 
myStoredProcedureCall.setString(1, "ONE"); 
myStoredProcedureCall.setString(2, "TWO"); 
myStoredProcedureCall.setString(9, "NINE"); 
ResultSet paramResults = myStoredProcedureCall.executeQuery(); 

然後我得到此SQLException拋出:

*** SQLException caught *** 
SQLState: JZ0SA 
Message: JZ0SA: Prepared Statement: Input parameter not set, index: 2. 
Vendor: 0 

對於我想要做的一些背景知識,我需要創建一個進程,從IBM MQ流接收關於產品的信息,然後在第三個應用程序中創建一個產品。第三方應用程序使用Sybase來存儲其數據,並創建一個產品,我需要調用具有大約130個參數的存儲過程。對於需要創建的產品類型,只需要設置其中約15個參數,剩下的參數將保留爲默認值。

選項我考慮是:

  • 創建自定義存儲過程,只有將我需要的值,然後調用第三方產品的存儲過程。
  • 在Java中設置所有參數的默認值。

當然,必須有一個更簡單的方法來做到這一點?

回答

6

此功能不通過JDBC支持。你必須創建一個SQL字符串和執行:

String sql = "exec my_stored_procedure\[email protected]_1 = ?,\[email protected]_2 = ?,\[email protected]_9 = ?"; 

PreparedStatement stmt = ... 
stmt.setString(1, "ONE"); 
stmt.setString(2, "TWO"); 
stmt.setString(3, "NINE"); 
stmt.execute(); 

記住:JDBC不試着去了解,你發送到數據庫除了一些特殊字符,如{}?的SQL。我曾經寫過一個接受JavaScript代碼段爲「SQL」的JDBC「數據庫」:我只是實現了DataSource,ConnectionResultSet,我可以使用JDBC接口查詢應用程序的內存模型,但是使用JavaScript作爲查詢語言。

+1

只是爲別人需要的。上面的例子中,String sql中的'\ n'可以替換爲一個空格,Sybase不需要單獨列出參數,它們只需用逗號分隔。 – alaniane 2017-12-06 23:05:48

+0

@alaniane正確。我從一些代碼中複製了一些代碼,我也記錄了這些語句。換行符只是爲了幫助人類解決SQL和SQL問題。 – 2017-12-08 14:36:40

0

您可以嘗試硬編碼null或空白字符串

"{call my_stored_procedure (?, ?, null, null, null, null , null, null, ?)}"

+1

如果我指定null,該參數不被設置在Sybase存儲過程的默認值 – JonnyWizz 2012-08-09 10:06:43

0
myStoredProcedureCall.setString(9, "NINE"); 

in above code index no 9 but it will be 3 because your parameter sequence start from 1 ; 
Alhrough you can another sql exception. 

I think you should use 

myStoredProcedureCall = 
    sybConn.prepareCall("{call my_stored_procedure (?, ?, null, null, null, null , null, null, ?)}"); 
myStoredProcedureCall.setString(1, "ONE"); 
myStoredProcedureCall.setString(2, "TWO"); 
myStoredProcedureCall.setString(3, "NINE"); 
ResultSet paramResults = myStoredProcedureCall.executeQuery(); 
0

//abobjects.com 下面對我的作品 高清getIDGEN(sTableName):
proc等於db.prepareCall(「{=調用DB.dbo.usp_IDGEN_string_v6(?,?)}「);

proc.registerOutParameter(3, types.INTEGER) 
proc.setString(2, sTableName) 
proc.setInt(3, 0) 
proc.execute() 
li_RI_ID = proc.getInt(3) 
print str(li_RI_ID) + " obtained from usp_IDGEN_string_v6" 
return li_RI_ID 

我的存儲過程是

create proc usp_IDGEN_string_v6 (@tablename varchar(32) , @ID numeric) 
as 
declare @seq  numeric 
declare @nextID numeric 
select @nextID=IDGEN_ID from DB_IDGEN where IDGEN_TableName = @tablename 
select @[email protected] + 1 from DB_IDGEN where IDGEN_Table 
Name = @tablename 
update DB_IDGEN set IDGEN_ID = @seq where IDGEN_TableName = @tablename 
select @ID = @seq 
return @ID 
相關問題