JDBC更新計數(shù)行及調(diào)用存儲過程返回多個結(jié)果集詳解
JDBC更新計數(shù)行及調(diào)用存儲過程返回多個結(jié)果集是本文我們主要要介紹的內(nèi)容,在開始本文的時候,我們先了解SQL Server中的一個命令:SET NOCOUNT ON;執(zhí)行該命令,表示不返回計數(shù)行,什么是計數(shù)行了,比如我們執(zhí)行DELETE ,UPDATE,INSERT的時候,對多少條數(shù)據(jù)進(jìn)行了修改,計數(shù)行的值就是多少?
- SET NOCOUNT ON added to prevent extra result sets from
- interfering with SELECT statements.
在JDBC的操作數(shù)據(jù)庫的過程中,你可以把Statement理解成為指向ResultSet的指針,如果數(shù)據(jù)庫允許返回記數(shù)行的話,Statement將指向該計數(shù)行,比如
- SET NOCOUNT ON;
- update TABLEA SET A='aa';--假設(shè)共100條數(shù)據(jù)被修改
- SELECT * FROM TABLEA;
調(diào)用callableStatement.execute();后callableStatement指向受影響的計數(shù)行,當(dāng)你再調(diào)用rs = callableStatement.getResultSet(); 的時候,結(jié)果集rs 為空。 無法查詢出表TABLEA 的數(shù)據(jù)Statement提供了一個getMoreResults()的方法,該方法能將當(dāng)前Statement "指針" 移動到下一個結(jié)果集。如果callableStatement.getUpdateCount()==-1&&getMoreResults()==true的話表明當(dāng)前statement對象正指向一個真正的結(jié)果集。
For Examle:
- package xx.qq.app;
- import java.sql.CallableStatement;
- import java.sql.Connection;
- import java.sql.ResultSet;
- import org.springframework.beans.factory.BeanFactory;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import com.mchange.v2.c3p0.ComboPooledDataSource;
- /**
- * @author Jack Zhang Email:fish2-2@163.com
- * @date 2011-08-22
- */
- public class AppTest {
- public static void main(String[] args) throws Exception {
- ApplicationContext context = new ClassPathXmlApplicationContext(
- new String[] { "applicationContext.xml" });
- BeanFactory factory = (BeanFactory) context;
- ComboPooledDataSource dataSource = (ComboPooledDataSource) factory
- .getBean("dataSource");
- Connection con = dataSource.getConnection();
- CallableStatement callableStatement = con
- .prepareCall("{call GetBasics(?,?)}");
- callableStatement.setString(1, "w");
- callableStatement.registerOutParameter(2, java.sql.Types.INTEGER);
- ResultSet rs=null;
- // 是否有結(jié)果集返回
- boolean hasResultSet = callableStatement.execute();
- // callableStatement--------->update
- System.out.println("執(zhí)行存儲過程后Statement是否指向真正的結(jié)果集:"+hasResultSet);
- System.out.println("受影響的行數(shù):"+callableStatement.getUpdateCount());
- callableStatement.getMoreResults();//------->select
- rs = callableStatement.getResultSet();
- System.out.println("受影響的行:"+callableStatement.getUpdateCount());
- while (rs.next()) {
- //System.out.println(rs.getObject(1));
- }
- callableStatement.getMoreResults();//-------->update
- System.out.println("受影響的行:"+callableStatement.getUpdateCount());
- callableStatement.getMoreResults();//-------->update
- System.out.println("受影響的行:"+callableStatement.getUpdateCount());
- callableStatement.getMoreResults();//-------->select
- System.out.println("受影響的行:"+callableStatement.getUpdateCount());
- rs = callableStatement.getResultSet();// 獲取到真實的結(jié)果集
- while (rs.next()) {
- //System.out.println(rs.getObject(1));
- }
- callableStatement.getMoreResults();//--------->update
- System.out.println("受影響的行:"+callableStatement.getUpdateCount());
- if (rs != null)
- rs.close();
- if (callableStatement != null)
- callableStatement.close();
- if (con != null)
- con.close();
- }
- }
輸出:
執(zhí)行存儲過程后是否返回結(jié)果集:false
- 受影響的行數(shù):262
- 受影響的行:-1 ,此處返回結(jié)果集
- 受影響的行:262
- 受影響的行:262
- 受影響的行:-1,此處返回結(jié)果集
- 受影響的行:262
存儲過程
- ALTER PROCEDURE GetBasics(
- @PERSON_NAME VARCHAR(32),
- @COUNT INT OUT
- )
- AS
- BEGIN
- SET NOCOUNT ON;
- update TABLE_A SET NAME='aa';
- SELECT @COUNTCOUNT = COUNT(*) FROM TABLE_A;
- update TABLE_A SET NAME='aa';
- SELECT * FROM TABLE_A;
- update TABLE_A SET NAME='aa';
- update TABLE_A SET NAME='aa';
- SELECT * FROM ORGS;
- update TABLE_A SET NAME='aa';
- END
- GO
以上就是JDBC更新計數(shù)行及調(diào)用存儲過程返回多個結(jié)果集的過程的詳細(xì)解釋及實例說明,本文就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!
【編輯推薦】






