【问题标题】:How to iterate thru a cursor returned from an oracle function如何遍历从 oracle 函数返回的游标
【发布时间】:2020-11-18 04:54:15
【问题描述】:

我想遍历从返回 SYS_REFCURSOR 的函数返回的记录 这可能吗?提前感谢您的帮助。

  FOR R_RECORD IN get_direct_reports(23) LOOP

    IF R_RECORD.EMAIL = 'Hi@.com' THEN
      do a bunch of stuff
    ELSE
      do a bunch of different stuff,etc
    END IF;
  END LOOP; 

示例函数 创建或替换函数 get_direct_reports( in_manager_id IN employees.manager_id%TYPE) 返回 SYS_REFCURSOR 作为 c_direct_reports SYS_REFCURSOR; 开始

OPEN c_direct_reports FOR 
SELECT 
   employee_id, 
   first_name, 
   last_name, 
   email
FROM 
  employees 
WHERE 
  manager_id = in_manager_id 
ORDER BY 
     first_name,   
     last_name;

RETURN c_direct_reports;
END;

调用函数的示例代码,我想将其更改为循环通过返回的数据

DECLARE
c_direct_reports SYS_REFCURSOR;
l_employee_id employees.employee_id%TYPE;
l_first_name  employees.first_name%TYPE;
l_last_name   employees.last_name%TYPE;
l_email       employees.email%TYPE;
BEGIN
-- get the ref cursor from function
c_direct_reports := get_direct_reports(46); 

-- process each employee
LOOP
  FETCH
     c_direct_reports
  INTO
     l_employee_id,
     l_first_name,
     l_last_name,
     l_email;
  EXIT
WHEN c_direct_reports%notfound;
   dbms_output.put_line(l_first_name || ' ' || l_last_name || ' - ' ||    l_email );
END LOOP;
-- close the cursor
CLOSE c_direct_reports;
END;

【问题讨论】:

    标签: oracle plsql database-cursor


    【解决方案1】:

    以下是如何使用SYS_REFCURSOR from 函数的示例代码:

    SQL> CREATE OR REPLACE FUNCTION DUMMY_FUNCTION RETURN SYS_REFCURSOR AS
      2  LV_CUR SYS_REFCURSOR;
      3  BEGIN
      4  OPEN LV_CUR FOR SELECT 1 AS COL1, 2 AS COL2 FROM DUAL
      5                  UNION ALL
      6                  SELECT 11 AS COL1, 12 AS COL2 FROM DUAL;
      7  RETURN LV_CUR;
      8  END DUMMY_FUNCTION;
      9  /
    
    Function created.
    
    SQL>
    SQL> SET SERVEROUT ON
    SQL> DECLARE
      2  LV_CUR SYS_REFCURSOR;
      3  LV_COL1 NUMBER;
      4  LV_COL2 NUMBER;
      5  BEGIN
      6  LV_CUR := DUMMY_FUNCTION;
      7  LOOP
      8  FETCH LV_CUR INTO LV_COL1, LV_COL2;
      9  EXIT WHEN LV_CUR%NOTFOUND;
     10  DBMS_OUTPUT.PUT_LINE('COL1: ' || LV_COL1 || ', COL2: ' || LV_COL2);
     11  END LOOP;
     12  CLOSE LV_CUR;
     13  END;
     14  /
    COL1: 1, COL2: 2
    COL1: 11, COL2: 12
    
    PL/SQL procedure successfully completed.
    
    SQL>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多