java—如何使用eclipselink调用函数

4xrmg8kj  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(387)

如何使用eclipselink调用返回sys\u refcursor的oracle函数?
有一个文档说明了如何调用函数,但不确定如何调用返回sys\u 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(用户名=>?);结束;bind=>[=>c\u 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)
如何解决此问题?

nqwrtyyt

nqwrtyyt1#

将函数保存在数据库中,然后使用函数调用执行它。
例如,我有一个名为“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);

因此,在日志中执行查询的输出是:

Resultado consulta: [4413700]
7eumitmz

7eumitmz2#

我想你必须详细说明 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;

请试一试!

相关问题