我有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的所有結果列表?
感謝
我有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的所有結果列表?
感謝
我覺得這樣的事情應該工作:
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());
}
}
既然你需要使用實體管理器,如果你的容器是符合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)
希望!這可能會幫助你。 [鏈接](http://stackoverflow.com/a/6782009/2244720) – hemalp108
感謝您的回覆,但我想從java而不是從oracle訪問該函數。我已經知道如何從oracle中做到這一點。 – gogagubi