如何使用EclipseLink调用函数

时间:2015-01-15 10:35:15

标签: java oracle jpa eclipselink sys-refcursor

如何使用EclipseLink调用返回sys_refcursor的Oracle函数?

有一个文档说明了调用函数,但不知道如何调用返回sys_refcursor的函数。

http://eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_namedstoredfunctionquery.htm

我尝试过如下

@NamedStoredFunctionQuery(name = "findEmployees", 
                          functionName = "getEmps", 
                          parameters = 
                          { @StoredProcedureParameter(queryParameter = "user", 
                                                      name = "username", 
                                                      direction = Direction.IN, 
                                                      type = String.class)
            } , 
    returnParameter = @StoredProcedureParameter(queryParameter = "c_cursor")
)

Oracle功能

CREATE or REPLACE FUNCTION getEmps (username varchar2)
      RETURN SYS_REFCURSOR
   AS
   c_cursor   SYS_REFCURSOR;
   BEGIN
   OPEN c_cursor FOR 
   SELECT * FROM employees where emp_no=username;
   RETURN c_cursor;

然而,当我执行时,我收到以下错误

  

内部异常:java.sql.SQLException:ORA-06550:第1行第13列:       PLS-00382:表达式类型错误       ORA-06550:第1行第7列:       PL / SQL:忽略语句

     

错误代码:6550       电话:开始? := getEmps(username =>?);结束;           bind => [=> c_cursor,S7845]       查询:DataReadQuery(name =" findEmps")           at org.eclipse.persistence.internal.jpa.QueryImpl.getDetailedException(QueryImpl.java:378)           在org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:260)           在org.eclipse.persistence.internal.jpa.QueryImpl.getResultList(QueryImpl.java:469)

如何解决此问题?

2 个答案:

答案 0 :(得分:1)

我认为你必须指定函数parmeter的Direction

CREATE or REPLACE FUNCTION getEmps (username IN varchar2)
      RETURN SYS_REFCURSOR
   AS
   c_cursor   SYS_REFCURSOR;
   BEGIN
   OPEN c_cursor FOR 
   SELECT * FROM employees where emp_no=username;
   RETURN c_cursor;

请试试吧!

答案 1 :(得分:0)

将函数保存在数据库中,然后通过FUNCTION调用执行它。

例如,我有一个名为“ SUMACAMPO”的Oracle函数,该函数求和数据库的两列:

enter image description here

我的查询:

select Function('SUMACAMPO') from Table t

Java代码:

Query q = em.createQuery("select Function('SUMACAMPO') from Table t");
List<Object[]> resultado= q.getResultList();
LOG.info("Resultado consulta: {}",resultado);

因此,在LOG中执行查询的输出为:

Resultado consulta: [4413700]