Call Cursor位于不同的程序

Call Cursor located in different procedure

我在一个存储过程中有一个相当复杂的游标,我将在另一个过程中需要它。在此过程中仅复制和粘贴光标是不好的做法吗?我可以像这样称呼光标吗?

OPEN diffProcedure.cursorName(params)... 
LOOP
    FETCH ....
    INTO ....
    EXIT WHEN ....
END LOOP;

光标大概是200行复杂的代码,我不太了解(Junior Dev从事复杂业务PL/SQL代码),但我知道它的作用。用我需要的参数调用它会得到所需的正确数据。

将光标从一个过程复制到另一个过程不是个好主意吗?我可以从不同的程序调用游标吗?

您不能从另一个过程引用在一个过程中声明的游标。
但是当您在包中声明一个游标时,您可以从位于同一包中的其他过程、其他包中甚至从独立过程中调用它。

简单例子:

CREATE OR REPLACE PACKAGE somepackage IS
   CURSOR my_cursor( par IN NUMBER ) IS
   SELECT par FROM dual;
END;
/

CREATE OR REPLACE PACKAGE someotherpackage IS
   PROCEDURE MY_Procedure;
END;
/

CREATE OR REPLACE PACKAGE BODY someotherpackage IS
  PROCEDURE MY_Procedure IS
     x NUMBER;
  BEGIN
    OPEN somepackage.my_cursor( 2 );
    FETCH somepackage.my_cursor INTO x;
    CLOSE somepackage.my_cursor;
    DBMS_OUTPUT.PUT_LINE( x );
  END;
END;
/

create or replace procedure some_standalone_procedure IS
  y NUMBER;
BEGIN
    OPEN somepackage.my_cursor( 5 );
    FETCH somepackage.my_cursor INTO y;
    CLOSE somepackage.my_cursor;
    DBMS_OUTPUT.PUT_LINE( y );
END;
/

现在进行火灾测试:

exec someotherpackage.MY_Procedure;

2


exec some_standalone_procedure;

5