【问题标题】:How to call function using EclipseLink如何使用 EclipseLink 调用函数
【发布时间】:2015-01-15 10:35:15
【问题描述】:

如何使用 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(用户名=>?);结尾; 绑定 => [=> c_cursor, S7845] 查询:DataReadQuery(name="findEmps") 在 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)

我该如何解决这个问题?

【问题讨论】:

  • 可以发布你的plsql storedFunction 吗?
  • 可能是您尝试执行无效的PLSQL函数块,但出现编译错误。
  • @CHHIBIAMOR 我已将我的 PLSQL 函数包含在我的问题中,并且函数已编译,并且我已从其他程序成功执行它。当我尝试使用 EclipseLink 调用时,我没有成功。

标签: java oracle jpa eclipselink sys-refcursor


【解决方案1】:

我认为你必须指定函数参数的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;

请尝试一下!

【讨论】:

  • 会尝试这种方法。
【解决方案2】:

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

例如,我有一个名为“SUMACAMPO”的 Oracle 函数,它将数据库的两列相加:

我的查询:

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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多