Не могу получить результат функции оракула в Java(EJB)

У меня есть функция оракула, которая возвращает sys_refcursor.

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

и я хочу позвонить из ejb(java). как это сделать? Как я могу получить весь список результатов sys_refcursor?

Спасибо

2 ответа

Я думаю, что-то подобное должно работать:

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());        
    }
}

Поскольку вам необходимо использовать Entity Manager, если ваш контейнер соответствует 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)
Другие вопросы по тегам