我正在尝试使用 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))
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;
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> …我正在执行以下操作,但它不起作用
select package_name.function_name(param,param) from dual
我正在调用一个返回光标的函数,所以我猜这"from dual"就是问题所在
还有另一种方法吗?
我有这个问题,我希望有人知道答案.我有一个oracle存储过程,它接受客户ID并返回ref_cursor中的所有客户订单.过度简化它,这就是我所拥有的:
Orders
- orderId
- siteID
Customers
- siteID
- Name
GetOrder(siteID, outCursor) /* returns all orders for a customer */
现在,我需要编写另一个采用客户名称并执行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;
我的问题是,如何在每次迭代中将GetOrder的返回附加到curReturn?正如它现在所写的那样,它会在循环的每个循环中覆盖它.谢谢!!
我正在使用oracle PL/SQL程序.我在另一个内部调用一个程序.我想将一个游标从嵌套过程返回到外部过程.这可能吗?它对程序有何不利影响?
以下是调用结构:
  Proc1( data1 IN integer, cursor1 OUT SYS_REFCURSOR ) {
               Proc2(data2 IN , cursor1 out) {
                       open cursor1 FOR
                select * from table;
               }
  }
这可能有点傻,但我想知道这是否可行.
我有一个返回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;
/
我可以用结果得到结果
select  get_employee_details('7369') from dual;
是否可以通过指定列名来获得上述函数的结果?例如,如果我想获得ename或salary,我如何在不使用plsql块的情况下在sql语句中指定?就像是
select  get_employee_details('7369') <specific column> from dual;
我有一个带有选择值的游标,我想在取决于我是否找到任何行之后做一些事情。
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;
这似乎不起作用,有什么帮助吗?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;
以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; …我有一个过程,它使用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 …我有两个存储过程,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;
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