2016-10-04 60 views
0

我有oracle函數返回sys_refcursor。無法將oracle函數結果導入java(ejb)

create or replace function get_person_salaries(p_year in number, 
                p_month in number) 
     return sys_refcursor 

我想從ejb(java)調用。這個怎麼做?我如何獲得sys_refcursor的所有結果列表?

感謝

+0

希望!這可能會幫助你。 [鏈接](http://stackoverflow.com/a/6782009/2244720) – hemalp108

+0

感謝您的回覆,但我想從java而不是從oracle訪問該函數。我已經知道如何從oracle中做到這一點。 – gogagubi

回答

1

我覺得這樣的事情應該工作:

Connection conn = getConnection(); 
CallableStatement call = 
    conn.prepareCall ("{ ? = call java_refcursor.job_listing (?, ?)}"); 

call.registerOutParameter (1, OracleTypes.CURSOR); // this is a key line 
call.setString (2, arg1); 
call.setString (3, arg2); 
call.execute(); 
ResultSet rs = (ResultSet)call.getObject (1); // Just casting sys_refcursor to ResultSet 
while (rs .next()) 
    System.out.println (rs.getString(1)); 

獲得在EJB連接方式:

@Stateless 
public class YourBean { 

    @Resource(lookup = "java:/jdbc/yourdatasource") 
    private DataSource dataSource; 

    public Connection getConnection() throws SQLException { 
     return connection = dataSource.getConnection());   
    } 
} 
+0

是的,但我沒有conn對象,因爲我使用EntityManager(Jpa) – gogagubi

+0

@vssk call.setString(1,arg1)是錯誤的,因爲位置1已經爲OracleTypes保留.CURSOR(返回參數) –

+0

是的,我的壞。更正了 – vssk

1

既然你需要使用實體管理器,如果你的容器是符合EE7的,那麼應該支持JPA 2.1,在這種情況下,您可以創建一個調用存儲過程的JPA查詢。從PRO JPA的書,似乎類似於您的需求,是如下的例子,:

StoredProcedureQuery q = em.createStoredProcedureQuery("fetch_emp"); 
q.registerStoredProcedureParameter("empList", void.class, ParameterMode.REF_CURSOR); 
if (q.execute()) { 
List<Employee> emp = (List<Employee>)q.getOutputParameterValue("empList"); 
// ... 
} 

也像@NamedQuery,在JPA 2.1,你可以創建如下@NamedStoredProcedure:

@NamedStoredProcedureQuery(
name="fetch_emp", 
procedureName="fetch_emp", 
parameters={ 
@StoredProcedureParameter(name="empList", type=void.class, 
mode=ParameterMode.REF_CURSOR) 
}, 
resultClasses=Employee.class) 
+0

中進行了更改,如何傳遞參數?我有參數p_year,p_month – gogagubi

+0

使用「查詢」「setParameter」方法之一。 – garfield

+0

是的,它的工作原理。謝謝))))Ευχαριστώ – gogagubi