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