無意中在利用Java執行store procedure要傳回ResultSet的結果時,發生"陳述式沒有傳回 Result
set"的錯誤訊息。後來google了一下發現原來是在我們的store procedure內如果有做類似紀錄
的更動,如建立一個虛擬table,插入新的資料。因此在這邊可以透過SQL語法設定來避免。
Java程式執行的錯誤訊息如下:
很簡單的一個例子,目的只是將兩個參數傳進去,並塞入到虛擬的table內,之後再針對該
table做查詢的動作來得到一個查詢結果!!
Java 程式碼如下:
很簡單的一支測試程式,呼叫store procedure並帶入相關的參數,之後執行executeQuery取
得一ResultSet要得到查詢的結果,並印出來!
執行後的結果如上圖所示,出現錯誤!!
後來google了一下發現蠻多人有這個問題,輾轉至微軟官方網站有提到SET NOCOUNT
的設定及下面這段說明
Stops the message that shows the count of the number of rows affected by a Transact-SQL statement or stored procedure from being returned as part of the result set.
因此當您在執行store procedure時,如果有上述相關的情形,請在執行sp時需加上
SET NOCOUNT ON,如下
如此一來,就可以正常的取得ResultSet結果.
set"的錯誤訊息。後來google了一下發現原來是在我們的store procedure內如果有做類似紀錄
的更動,如建立一個虛擬table,插入新的資料。因此在這邊可以透過SQL語法設定來避免。
Java程式執行的錯誤訊息如下:
欲呼叫的Store Procedure如下:
IF OBJECT_ID ( 'dbo.sp_income_record3', 'P' ) IS NOT NULL DROP PROCEDURE dbo.sp_income_record3; GO Create Proc sp_income_record3 @PARAM1 VARCHAR(10), @PARAM2 VARCHAR(10) WITH RECOMPILE As create table #tmp_no ( no varchar(16) not null, seq varchar(4) not null primary key (no,seq) ); declare @st varchar(100); set @st = ' insert into #tmp_no(no,seq) values ('+@PARAM1+', '+@PARAM2+') '; exec (@st); --執行@st select no + seq as new_no from #tmp_no Go
很簡單的一個例子,目的只是將兩個參數傳進去,並塞入到虛擬的table內,之後再針對該
table做查詢的動作來得到一個查詢結果!!
Java 程式碼如下:
Connection m_conn = null;
CallableStatement cs = null;
String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String url = "jdbc:sqlserver://localhost:1433;DatabaseName=Homework";
String user = "sa";
String password = "gba123";
String sql = "{Call sp_income_record3 ('103001', '1')}";
try{
Class.forName(driver);
m_conn = DriverManager.getConnection(url, user, password);
cs = m_conn.prepareCall(sql);
ResultSet rs = cs.executeQuery();
while(rs.next()){
System.out.println(rs.getString("new_no"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
try {
if(m_conn != null)
m_conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
很簡單的一支測試程式,呼叫store procedure並帶入相關的參數,之後執行executeQuery取
得一ResultSet要得到查詢的結果,並印出來!
執行後的結果如上圖所示,出現錯誤!!
後來google了一下發現蠻多人有這個問題,輾轉至微軟官方網站有提到SET NOCOUNT
的設定及下面這段說明
Stops the message that shows the count of the number of rows affected by a Transact-SQL statement or stored procedure from being returned as part of the result set.
因此當您在執行store procedure時,如果有上述相關的情形,請在執行sp時需加上
SET NOCOUNT ON,如下
... WITH RECOMPILE AS SET NOCOUNT ON ...
如此一來,就可以正常的取得ResultSet結果.
nice 解決了我的問題
回覆刪除