2013-08-07 28 views
0


我已經完成下面的示例JDBC程序,它檢索用戶details.Now我感到驚訝,從相同的可調用語句我得到不同的結果集爲相同的輸出參數index.Ideally它應該返回相同的ResultSet對象。線程「主」中的異常java.sql.SQLException:缺少定義

  1. 當我得到了結果集那麼我移動光標-1 0
  2. 我是從另一個結果集檢索數據使用 列名相同的輸出PARAM然後我得到以下異常

異常在線程 「主要」 值java.sql.SQLException:缺少定義

System.out.println("Before loading connection"); 
    DriverManager.registerDriver(new oracle.jdbc.OracleDriver()); 
    Connection connection = DriverManager.getConnection(
      "jdbc:oracle:thin:@170.45.3.165:1541/testdb.mycomp.com", 
      "admin", "admin123"); 
    System.out.println("Connection loaded " + connection); 

    CallableStatement callProcedure = connection 
      .prepareCall("{call ADMIN_USER.Fetch_User_Details(?,?)}"); 

    callProcedure.setString(1, "userid=testid"); 

    callProcedure.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR); 
    callProcedure.execute(); 

    ResultSet resultUserDetails = (ResultSet) callProcedure.getObject(2); 
    resultUserDetails.next(); 

    ResultSet resultUserDetails1 = (ResultSet) callProcedure.getObject(2); 
    String username = resultUserDetails1.getString(COL_NAME_USER_NAME); 

    System.out.println(resultUserDetails); 
    System.out.println(resultUserDetails1); 

    System.out.println(resultUserDetails == resultUserDetails1); 

任何人都可以有任何想法,爲什麼我們從可調用語句獲得兩個不同的結果集爲相同的輸出索引?

回答

0

根據CallableSatement API的表達應該是這樣的

{call <procedure-name>[(<arg1>,<arg2>, ...)]} 

嘗試

CallableStatement callProcedure = connection.prepareCall("{call ADMIN_USER.Fetch_User_Details(?,?)}"); 
+0

數據庫具體方法也是允許的(您不使用JDBC'call'逃逸必需的。['CALL'](http://docs.oracle。 COM/CD/E11882_01/server.112/e26088/statements_4008.htm#BABDEHHG)是執行存儲過程 –

0

您是否嘗試過檢查,如果僅參考是不同的(可能是由於代理或骯髒的狀態,因爲你執行前的第二一個next()`的getObject())?
嘗試執行存儲過程的

ResultSet resultUserDetails = (ResultSet) callProcedure.getObject(2); 
ResultSet resultUserDetails1 = (ResultSet) callProcedure.getObject(2); 

System.out.println(resultUserDetails); 
System.out.println(resultUserDetails1); 
// Check ref or object equality 
System.out.println(resultUserDetails == resultUserDetails1); 
System.out.println(resultUserDetails.equals(resultUserDetails1)); 

resultUserDetails.next(); 
String username = resultUserDetails.getString(COL_NAME_USER_NAME); 
resultUserDetails1.next(); 
String username1 = resultUserDetails1.getString(COL_NAME_USER_NAME); 
System.out.println(username); 
System.out.println(username1); 
// We read the same username or we are reading first and second username? 
// If the are different probably resultset is the same, just with different 
// reference 
System.out.println(resultUserDetails.equals(resultUserDetails1)); 
+0

您好Bellabax甲骨文方法,我嘗試了上述事情時,試圖然而對象的相等(==)結果是越來越FALSE.Also開始使用第二參考,那麼你會得到exception.I考慮,他們指向同一個對象上heap.but兩個參考都指向不同的對象寫的代碼獲取山坳。 –

+0

OPS,是我的錯!例外是扔,因爲你正在閱讀同一列兩次(我的失誤上'字符串username = resultUser Details1.getString(COL_NAME_USER_NAME);')!檢查新的代碼,寫評論System.out的結果 –

相關問題