Plsql 无法使用returning into子句获取记录类型游标的结果

Plsql 无法使用returning into子句获取记录类型游标的结果,plsql,oracle11g,cursor,Plsql,Oracle11g,Cursor,我有一个程序,应该返回3个部门名称,并更新这三个部门名称的开始时间。此脚本将由并行线程运行。 我尝试使用游标实现它,但没有返回结果 带插入的表格: create table dept (sno number(4), deptname varchar2(40), start_time date) insert into dept values(1,'DEPT1',NULL); insert into dept values(1,'DEPT2',NULL); insert into dept va

我有一个程序,应该返回3个部门名称,并更新这三个部门名称的开始时间。此脚本将由并行线程运行。 我尝试使用游标实现它,但没有返回结果

带插入的表格:

create table dept (sno number(4), deptname  varchar2(40), start_time date)
insert into dept values(1,'DEPT1',NULL);
insert into dept values(1,'DEPT2',NULL);
insert into dept values(1,'DEPT3',NULL);
insert into dept values(2,'DEPT4',NULL);
insert into dept values(2,'DEPT5',NULL);
insert into dept values(2,'DEPT6',NULL);
方法1:
通过这种方法,我可以用日期更新表,但在游标中无法检索部门名称。

以下是我对这个问题的理解

附表内容:

SQL> select * from tdept;

       SNO DEPTNAME                                 START_TIME
---------- ---------------------------------------- ----------
         1 DEPT1
         1 DEPT2
         1 DEPT3
         2 DEPT4
         2 DEPT5
         2 DEPT6

6 rows selected.
该程序

  • 更新表
  • 返回refcursor

执行&结果:

SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';

Session altered.

SQL> var lout refcursor
SQL>
SQL> exec get_deptname(2, :lout);

PL/SQL procedure successfully completed.

SQL> select * from tdept;

       SNO DEPTNAME                                 START_TIME
---------- ---------------------------------------- -------------------
         1 DEPT1
         1 DEPT2
         1 DEPT3
         2 DEPT4                                    10.04.2018 20:32:23
         2 DEPT5                                    10.04.2018 20:32:23
         2 DEPT6                                    10.04.2018 20:32:23

6 rows selected.

SQL> print lout

DEPTNAME
----------------------------------------
DEPT4
DEPT5
DEPT6

SQL>

欢迎来到堆栈溢出!请在发布前在预览部分查看您的帖子,并检查是否一切正常。如果没有,那就继续写下去,直到你觉得它很容易阅读和理解为止。这将大大增加有人回答你问题的机会
op_cursor
是一个ref cursor,但是
将批量收集返回到
是用于填充收集。是否有其他替代方法来实现此目的?我也尝试返回到,但即使这样,当我尝试从应用程序返回deptname时,也没有返回任何值。声明本人的姓名;c_光标_部门名称;开始获取deptname(2,c_游标);将c_游标循环到i中;DBMS_OUTPUT.PUT_LINE('name:'| | i.op_deptname);未找到c_光标%n时退出;端环;结束;请编辑您的初始消息,删除所有未使用的内容,并仅发布当前正在使用的代码。在没有看到你的情况下,很难猜出什么是错的。
SQL> select * from tdept;

       SNO DEPTNAME                                 START_TIME
---------- ---------------------------------------- ----------
         1 DEPT1
         1 DEPT2
         1 DEPT3
         2 DEPT4
         2 DEPT5
         2 DEPT6

6 rows selected.
SQL> create or replace procedure get_deptname
  2    (ip_sno in tdept.sno%type,
  3     op_cursor out sys_refcursor
  4    )
  5  is
  6  begin
  7    update tdept t set
  8      t.start_time = sysdate
  9      where t.sno = ip_sno;
 10
 11    open op_cursor for
 12      select deptname
 13      from tdept
 14      where sno = ip_sno;
 15  end;
 16  /

Procedure created.
SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';

Session altered.

SQL> var lout refcursor
SQL>
SQL> exec get_deptname(2, :lout);

PL/SQL procedure successfully completed.

SQL> select * from tdept;

       SNO DEPTNAME                                 START_TIME
---------- ---------------------------------------- -------------------
         1 DEPT1
         1 DEPT2
         1 DEPT3
         2 DEPT4                                    10.04.2018 20:32:23
         2 DEPT5                                    10.04.2018 20:32:23
         2 DEPT6                                    10.04.2018 20:32:23

6 rows selected.

SQL> print lout

DEPTNAME
----------------------------------------
DEPT4
DEPT5
DEPT6

SQL>