标签: sys-refcursor

使用 spring 数据 jpa 在存储过程中读取引用游标作为输出参数返回 null

我正在尝试使用 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)

jpa sys-refcursor spring-data-jpa spring-boot

6
推荐指数
1
解决办法
4310
查看次数

如何调用包中的函数

我正在执行以下操作,但它不起作用

select package_name.function_name(param,param) from dual
Run Code Online (Sandbox Code Playgroud)

我正在调用一个返回光标的函数,所以我猜这"from dual"就是问题所在

还有另一种方法吗?

sql database oracle plsql sys-refcursor

5
推荐指数
1
解决办法
5万
查看次数

返回Oracle引用游标并附加多个结果

我有这个问题,我希望有人知道答案.我有一个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 sys-refcursor

4
推荐指数
2
解决办法
3万
查看次数

在oracle pl/sql中将游标从内部过程返回到外部过程

我正在使用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)

oracle plsql cursor sys-refcursor

3
推荐指数
1
解决办法
6779
查看次数

函数从具有特定列的sql返回sys_refcursor调用

这可能有点傻,但我想知道这是否可行.

我有一个返回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)

sql plsql function sys-refcursor oracle10g

3
推荐指数
2
解决办法
4万
查看次数

检查 SYS_REFCURSOR 是否为空的最佳方法

我有一个带有选择值的游标,我想在取决于我是否找到任何行之后做一些事情。

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

sql oracle plsql sys-refcursor

3
推荐指数
1
解决办法
3万
查看次数

使用立即执行引用游标

我想在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)

sql oracle plsql sys-refcursor execute-immediate

2
推荐指数
1
解决办法
2万
查看次数

返回显式游标的SQL语句

以Oracle论坛中显示的示例:使用plsql生成excel(xls),我想从查询的数据集生成excel文件.

提供的示例有效.但是,我遇到了一些挑战:

  1. 我的SQL查询很长,超过了VARCHAR24000字符限制.
  2. 我想将参数传递给我的查询.
  3. 我想以一种非常简单的方式完成它而不使用动态SQL(如果可能的话).

我提出的是下面的内容:

包装定义:

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)

sql oracle sys-refcursor

2
推荐指数
1
解决办法
1464
查看次数

如何访问结构并获取列表,refcursor的数据类型?

我有一个过程,它使用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)

oracle cursor sys-refcursor ref-cursor oracle11g

2
推荐指数
1
解决办法
1342
查看次数

如何从anther调用一个存储过程并修改返回的refcursor?

我有两个存储过程,p_proc1p_proc2.p_proc1返回一个refcursor,我想使用中的数据p_proc2.是否有可能通话p_proc1p_proc2,并修改数据集(外连接另一个表)?数据库是Oracle.

oracle stored-procedures sys-refcursor

1
推荐指数
1
解决办法
3398
查看次数

SYS_REFCURSOR 作为 OUT 参数

我有一张桌子包含 (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)

oracle procedure sys-refcursor

1
推荐指数
1
解决办法
4万
查看次数

JPA和SYS_REFCURSOR类似于OUT参数

我想用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)

java plsql sys-refcursor eclipselink glassfish-4

0
推荐指数
1
解决办法
9774
查看次数