【问题标题】:Cursor FOR LOOP with cursor as parameter以游标为参数的游标 FOR LOOP
【发布时间】:2023-01-20 16:31:20
【问题描述】:

我有以下过程执行一些业务逻辑(通过游标循环):

PROCEDURE myproc() AS

  CURSOR mycur IS
    SELECT * FROM mytable;

BEGIN

  FOR c IN mycur LOOP

    ...business logic here...
    ...many lines of code...

  END LOOP;

END myproc;

我想要不同的程序并执行相同不同游标(数据集)的业务逻辑。例如,我想要一个程序 myproc_adopters() 用于:

SELECT * FROM mytable WHERE cutomer_type='Adopters'

和其他人的另一个程序myproc_others()

SELECT * FROM mytable WHERE customer_type!='Adopters'

所以我想要一个包含游标循环和业务逻辑的主过程mainproc(),以及调用该主过程并发送不同游标作为参数的其他过程。问题是游标 FOR 循环似乎不接受游标作为我可以作为过程调用参数发送的变量:

PROCEDURE myproc_adopters() AS
  CURSOR mycur IS
    SELECT * FROM mytable WHERE customer_type='Adopters';
BEGIN
  mainproc(mycur);
END myproc_adopters;

PROCEDURE myproc_others() AS
  CURSOR mycur IS
    SELECT * FROM mytable WHERE customer_type!='Adopters';
BEGIN
  mainproc(mycur);
END myproc_others;




PROCEDURE mainproc(mycur IN SYS_REFCURSOR) AS
BEGIN
  FOR c IN mycur LOOP <-- does not accept cursor as variable
  ...
  END LOOP;
END mainproc;

如何将不同的游标发送到同一个游标FOR LOOP?

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    你的想法是好的(至少对我来说),但是 - 你必须通过 refcursor(正如你声明的那样)。

    例如:

    主要过程:

    SQL> create or replace procedure mainproc (mycur in sys_refcursor)
      2  is
      3    l_row emp%rowtype;
      4  begin
      5    loop
      6      fetch mycur into l_row;
      7      exit when mycur%notfound;
      8
      9      dbms_output.put_line(l_row.ename ||' - '|| l_row.job ||' - '|| l_row.sal);
     10    end loop;
     11  end;
     12  /
    
    Procedure created.
    

    此过程接受一个参数,并根据它根据某些条件打开 refcursor,然后调用 mainproc,传递该 refcursor:

    SQL> create or replace procedure myproc_adopters (par_deptno in emp.deptno%type) is
      2    l_rc sys_refcursor;
      3  begin
      4    if par_deptno = 10 then
      5       open l_rc for select * from emp where job = 'CLERK';
      6    elsif par_deptno = 20 then
      7        open l_rc for select * from emp where sal > 2000;
      8    end if;
      9
     10    mainproc (l_rc);
     11  end;
     12  /
    
    Procedure created.
    

    测试:

    SQL> set serveroutput on
    SQL> exec myproc_adopters(10);
    SMITH - CLERK - 840
    ADAMS - CLERK - 1100
    JAMES - CLERK - 950
    MILLER - CLERK - 1300
    
    PL/SQL procedure successfully completed.
    
    SQL>
    SQL> exec myproc_adopters(20);
    JONES - MANAGER - 2975
    BLAKE - MANAGER - 2850
    CLARK - MANAGER - 2450
    SCOTT - ANALYST - 3000
    KING - PRESIDENT - 5000
    FORD - ANALYST - 3000
    
    PL/SQL procedure successfully completed.
    
    SQL>
    

    【讨论】:

      猜你喜欢
      • 2021-06-10
      • 1970-01-01
      • 2022-01-18
      • 2015-10-09
      • 2023-04-04
      • 1970-01-01
      • 2019-04-27
      • 1970-01-01
      • 2013-07-22
      相关资源
      最近更新 更多