我正在尝试使用 spring 数据 jpa 和 spring 引导读取 oracle 存储过程中的 refcursor,该存储过程成功运行,但对返回的 List 的引用始终为空。
我尝试使用 Hibernate 作为 JPA 提供程序和 Eclipse Link 没有成功,下面是 oracle ddl 和 java 代码
Oracle 表(我用一些示例数据填充了该表)
CREATE TABLE role
(id NUMBER(10,0),
name VARCHAR2(255 CHAR))
Run Code Online (Sandbox Code Playgroud)
Oracle 存储过程
PROCEDURE collect_roles (role_list_o OUT SYS_REFCURSOR) IS
ex EXCEPTION;
BEGIN
OPEN role_list_o FOR SELECT id, name FROM role;
END;
Run Code Online (Sandbox Code Playgroud)
pom.xml(oracle jdbc 驱动依赖是从本地 ojdbc7.jar 安装在 maven 中的)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework</groupId>
<artifactId>gridapp</artifactId>
<version>0.1.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
<properties> …Run Code Online (Sandbox Code Playgroud) 我正在执行以下操作,但它不起作用
select package_name.function_name(param,param) from dual
Run Code Online (Sandbox Code Playgroud)
我正在调用一个返回光标的函数,所以我猜这"from dual"就是问题所在
还有另一种方法吗?
我有这个问题,我希望有人知道答案.我有一个oracle存储过程,它接受客户ID并返回ref_cursor中的所有客户订单.过度简化它,这就是我所拥有的:
Orders
- orderId
- siteID
Customers
- siteID
- Name
GetOrder(siteID, outCursor) /* returns all orders for a customer */
Run Code Online (Sandbox Code Playgroud)
现在,我需要编写另一个采用客户名称并执行LIKE查询以获取所有custId的过程,然后我需要重用GetOrder方法来返回找到的custIds的所有订单,如下所示:
PROCEDURE GetOrderbyCustName(
p_name IN VARCHAR2,
curReturn OUT sys_refcursor
)
IS
siteid number;
BEGIN
FOR rec in SELECT site_id FROM customers WHERE name LIKE p_name
LOOP
-- This will replace curReturn in each iteration
-- how do I append instead?
GetOrder(rec.site_id,
curReturn
);
END LOOP;
END GetOrderbyCustName;
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何在每次迭代中将GetOrder的返回附加到curReturn?正如它现在所写的那样,它会在循环的每个循环中覆盖它.谢谢!!
我正在使用oracle PL/SQL程序.我在另一个内部调用一个程序.我想将一个游标从嵌套过程返回到外部过程.这可能吗?它对程序有何不利影响?
以下是调用结构:
Proc1( data1 IN integer, cursor1 OUT SYS_REFCURSOR ) {
Proc2(data2 IN , cursor1 out) {
open cursor1 FOR
select * from table;
}
}
Run Code Online (Sandbox Code Playgroud) 这可能有点傻,但我想知道这是否可行.
我有一个返回sys_refcursor的函数
CREATE OR REPLACE FUNCTION get_employee_details(p_emp_no IN EMP.EMPNO%TYPE)
RETURN SYS_REFCURSOR
AS
o_cursor SYS_REFCURSOR;
BEGIN
OPEN o_cursor FOR
SELECT EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO
FROM emp
WHERE EMPNO = p_emp_no;
RETURN o_cursor;
-- exception part
END;
/
Run Code Online (Sandbox Code Playgroud)
我可以用结果得到结果
select get_employee_details('7369') from dual;
Run Code Online (Sandbox Code Playgroud)
是否可以通过指定列名来获得上述函数的结果?例如,如果我想获得ename或salary,我如何在不使用plsql块的情况下在sql语句中指定?就像是
select get_employee_details('7369') <specific column> from dual;
Run Code Online (Sandbox Code Playgroud) 我有一个带有选择值的游标,我想在取决于我是否找到任何行之后做一些事情。
recs_Table SYS_REFCURSOR;
begin
open recs_Table for
select * from table1, table2;
if recs_Table%found then
--do this
else
--do that
end if;
end;
Run Code Online (Sandbox Code Playgroud)
这似乎不起作用,有什么帮助吗?Ty
我想在ref_cursor中得到结果,但我无法做到这一点.
请建议我如何使用Execute immediate在ref_cursor中获取结果
CREATE OR REPLACE PROCEDURE TEST_PROC_QT ( p_name IN VARCHAR2,
p_result_set OUT sys_refcursor ) IS
v_sql VARCHAR2(4000);
BEGIN
v_sql := '';
v_sql := 'SELECT * FROM USERS WHERE 1=1 ';
IF p_name is not null THEN
v_sql := v_sql || ' AND login_id = :v_name';
ELSE
v_sql := v_sql || ' AND ((1=1) or :v_name is null)';
END IF;
Dbms_output.put_line(v_sql);
EXECUTE IMMEDIATE v_sql
--OPEN p_result_set for v_sql
--INTO p_result_set using p_name;
END;
Run Code Online (Sandbox Code Playgroud) 以Oracle论坛中显示的示例:使用plsql生成excel(xls),我想从查询的数据集生成excel文件.
提供的示例有效.但是,我遇到了一些挑战:
VARCHAR24000字符限制.我提出的是下面的内容:
包装定义:
create or replace package tabletoexcel
as
PROCEDURE run_query(p_fh IN UTL_FILE.FILE_TYPE
, p_cur IN SYS_REFCURSOR);
PROCEDURE start_workbook (p_fh IN UTL_FILE.FILE_TYPE);
PROCEDURE end_workbook (p_fh IN UTL_FILE.FILE_TYPE);
PROCEDURE start_worksheet(p_fh IN UTL_FILE.FILE_TYPE
, p_sheetname IN VARCHAR2);
PROCEDURE end_worksheet (p_fh IN UTL_FILE.FILE_TYPE);
PROCEDURE set_date_style (p_fh IN UTL_FILE.FILE_TYPE);
end tabletoexcel;
create or replace package body tabletoexcel
as
PROCEDURE run_query(p_fh UTL_FILE.FILE_TYPE
, p_sql IN VARCHAR2) IS
v_v_val VARCHAR2(4000);
v_n_val NUMBER;
v_d_val DATE;
v_ret NUMBER;
c NUMBER; …Run Code Online (Sandbox Code Playgroud) 我有一个过程,它使用refcursor获取输出,并且游标中的数据/结构将是动态的.每次都取决于输入数据类型而光标中没有列会有所不同.那么如何访问此结构并获取数据类型?
PROCEDURE PROC_B ( name_ IN VARCHAR2,
date_ IN DATE,
code_ IN VARCHAR2,
sp_name_ IN VARCHAR2,
wrapper_ OUT sys_refcursor,
datyapes_ OUT VARCHAR2,
TS2_ OUT VARCHAR2,
header_ OUT VARCHAR2)
AS
TS_ DATE;
BEGIN
PROC_A (name_, date_, code_, sp_name_, wrapper_, TS_, header_);
TS2_:= TO_CHAR(TS_, 'MM-DD-YYYY.HH24_MI');
-- Logic should come here for below requirement
-- Get the datatypes of variables from wrapper_ (ref cursor datatype) and send them back in datyapes_ .
-- Eg1 : If ref cursor returns 2 values with dataytpes …Run Code Online (Sandbox Code Playgroud) 我有两个存储过程,p_proc1和p_proc2.p_proc1返回一个refcursor,我想使用中的数据p_proc2.是否有可能通话p_proc1中p_proc2,并修改数据集(外连接另一个表)?数据库是Oracle.
我有一张桌子包含 (username-primarykey,password,age,gender);
必须创建像 procedure(username in varchar,s_cursor out sys_refcursor);
过程必须接受username并返回行 ( where username=in parameter) 作为游标。
规则:光标必须并且应该具有唯一的序列号以及它给出的记录。例子:(unique no(sequence),username ,password,age,gender)
每次过程都应返回单个记录和 uniqueno(sequence)
我想用SYS_REFCURSOR类似OUT参数的JPA调用一个过程.使用普通JDBC非常容易,但我不确定JPA是否可行.
我的程序如下:
CREATE OR REPLACE FUNCTION FN_GET_COINS
RETURN SYS_REFCURSOR
IS vCursor SYS_REFCURSOR;
BEGIN
OPEN vCursor FOR
SELECT
...
RETURN vCursor;
CLOSE vCursor;
EXCEPTION
...
END FN_GET_COINS;
Run Code Online (Sandbox Code Playgroud) sys-refcursor ×12
oracle ×9
plsql ×6
sql ×5
cursor ×2
database ×1
eclipselink ×1
function ×1
glassfish-4 ×1
java ×1
jpa ×1
oracle10g ×1
oracle11g ×1
procedure ×1
ref-cursor ×1
spring-boot ×1