Oracle PL / SQL - 将游标列提取到另一个游标中

时间:2018-03-14 15:57:57

标签: oracle plsql

我正在尝试将游标lrefcur_equip_work的列提取到另一个游标中。

lrefcur_equip_work := equipment_work_type_lib.get_equipment_type_list
                        (pn_equipment_type_id => lr_equipment_type.equipment_type_id);

这将返回列

中的数据
EQUIPMENT_TYPE_ID   WORK_TYPE_ID

WORK_TYPE_ID列是表WORK_TYPES的主键。

我需要一个WORK_TYPES记录的refcursor,使用从我原来的refcursor中提取的主键WORK_TYPE_ID获取。

使用伪代码(不起作用),这实际上是我试图做的事情:

lrefcur_equip_work SYS_REFCURSOR;
lrefcur_new        SYS_REFCURSOR;

BEGIN

 lrefcur_equip_work := equipment_work_type_lib.get_equipment_type_list(pn_equipment_type_id => lr_equipment_type.equipment_type_id);

LOOP
  FETCH lrefcur_equip_work INTO equip_work_record
    OPEN lrefcur_new FOR
      SELECT * from work_types where work_type_id = equip_work_record.work_type_id;

当然,这只能检索一条记录,因为我非常确定反馈者不会像这样动态地工作。是否有另一种方法来构建第二个refcursor?

1 个答案:

答案 0 :(得分:0)

你无法“获取”游标,它在Oracle中没有任何意义。

你可以做这样的事情,但这不是一个很好的设计:

DECLARE
  lrefcur_equip_work SYS_REFCURSOR;
  lrefcur_new        SYS_REFCURSOR;
  work_types_rec     work_type%rowtype;
BEGIN

 lrefcur_equip_work := equipment_work_type_lib.get_equipment_type_list
                         (pn_equipment_type_id => lr_equipment_type.equipment_type_id);

LOOP
  FETCH lrefcur_equip_work INTO equip_work_record
    OPEN lrefcur_new FOR
      SELECT * 
        into work_types_rec     
        from work_types where work_type_id = equip_work_record.work_type_id;

  DBMS_OUTPUT.PUT_LINE (work_types_rec.work_type_id);

您是否被迫使用equipment_work_type_lib.get_equipment_type_list构建,或者您可以编写更有用的内容吗?类似的东西:

DECLARE
  lrefcur_new        SYS_REFCURSOR;
BEGIN
  OPEN lrefcur_new FOR
    SELECT * 
      from work_types where work_type_id IN
         (/* Whatever query you are running in equipment_work_type_lib.get_equipment_type_list */)

END;

或者您可以更改函数以返回表TYPE:

create type t_equip_list_tab is table of number;

function get_equipment_type_list (...)
  return t_equip_list_tab;

然后:

DECLARE
  lrefcur_new        SYS_REFCURSOR;
BEGIN
  OPEN lrefcur_new FOR
    SELECT * 
      from work_types where work_type_id IN
         TABLE (equipment_work_type_lib.get_equipment_type_list
                 (pn_equipment_type_id => lr_equipment_type.equipment_type_id)
               );