调用位于不同程序的光标

时间:2018-02-15 20:45:57

标签: sql oracle stored-procedures plsql cursor

我有一个相当复杂的光标位于存储过程中,我将需要在不同的过程中。在此过程中复制和粘贴光标是不好的做法吗?我可以把那个光标称为这样吗?

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

光标可能是200行复杂的代码,我对(Junior Dev处理复杂的业务PL / SQL代码)没有很好的理解,但我知道它的作用。使用我需要的参数调用它将获得所需的正确数据。

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

1 个答案:

答案 0 :(得分:1)

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

简单的例子:

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