如何使用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)
如何解决此问题?
答案 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函数,该函数求和数据库的两列:
我的查询:
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]