2012-06-19 55 views
1

我有一個存儲過程返回SYS_REFCURSOR,我試圖獲取使用JDBC從Java光標。錯誤使用取出由PLSQL SYS光標時,JDBC

PLSQL存儲過程

create or replace procedure my_proc(p_deptno IN number,p_emp_no IN varchar2 
    , p_cursor OUT SYS_REFCURSOR) 
    is 
    begin 
    open p_cursor FOR 
    select * 
    from emp 
    where deptno = p_deptno and emp_number=p_emp_no; 
    end proc; 
    /

Java代碼

callablestatement = connection.prepareCall("{cal my_proc(?,?,?)} "); 
callablestatement.setInt(1, param1); 
callablestatement.setString(2, param2); 
callablestatement.registerOutParameter(3, OracleTypes.CURSOR); 
callablestatement.execute(); 
resultSet = ((OracleCallableStatement)callablestatement).getCursor(4); 
      while (resultSet.next()) { 
       <classname> = mapList(resultSet); 
       logger.info(resultSet.getString(1)); 
      } 

當我執行我正在以下execeptions

java.lang.NullPointerException at callablestatement.execute(); 

Non supported SQL92 token at position: 3: cal 
0以上
+0

AT在'callablestatement.execute什麼線空 – shareef

+0

();'謝謝 – user75ponic

+2

看看了'prepareCall'線。應該是'調用my_proc'而不是'cal my_proc'? –

回答

0

我已經解決了這個問題,它有解決了我的問題。

我用以下方式調用我的函數。

private final String FUNCTIONAME= "begin ? :=myfunc(?,?,?); end;""; 

感謝

0

使用theCallableStatement.setObject(代替 中

.setString.setInt

它也theCallableStatement.setNull爲空

,但保持registerOutParameter相同

描述的方法

用給定的對象設置指定參數的值。 第二個參數必須是Object類型;因此,java.lang 等效對象應該用於內置類型。規範指定了從Java對象類型到 SQL類型的標準映射。在發送到數據庫之前,給定的參數將被轉換爲相應的SQL類型 。注意,該方法可以 被用於傳遞特定於數據庫的抽象數據類型,通過使用特定的驅動程序 Java類型。如果對象是實現 SQLData接口的類,JDBC驅動程序應該調用方法 SQLData.writeSQL將它寫入SQL數據流中。如果,在其他 手,該對象是實現Ref,BLOB,CLOB爲NClob, STRUCT,java.net.URL中,或陣列的一類,則驅動程序應當將它傳遞給 數據庫作爲相應的值SQL類型。此方法拋出 異常,如果出現混淆,例如,如果該對象是實現上述指定接口的一個以上的類的 。 注意:並非所有的數據庫都允許將非類型的Null發送到 後端。爲了獲得最大的可移植性,的setNull或的setObject(字符串 參數名稱,對象x,INT則sqlType)方法應該被用來代替 的setObject(字符串參數名稱,對象x)。

+3

-1沒有評論我怎麼能學會不要犯同樣的錯誤!請張貼原因。 – shareef

+0

我已經設法通過使用函數而不是過程來解決問題。 – user75ponic

+1

我不是downvoter,但你可以編輯你的回答,並解釋你的意思,而不是'。而不是...什麼? –

1

您的發言一個錯字:

{cal my_proc(?,?,?)} 

應通過使用相同的代碼的函數,如在程序

{call my_proc(?,?,?)} 
+0

這是一個錯字當我在這裏複製stackoverflow.com。謝謝 – user75ponic

+0

@Polappan你確定嗎?因爲該錯字也包含在您的問題中的錯誤消息中。 –