在函数内部检查它不是一个好主意。您错过了返回光标的原因。而是在函数之外进行。
DECLARE
l_rc SYS_REFCURSOR := my_func();
TYPE events_ntt IS TABLE OF NUMBER;
l_events events_ntt;
l_lookup events_ntt := events_ntt(100);
l_diff events_ntt;
BEGIN
FETCH l_rc BULK COLLECT INTO l_events;
l_diff := l_events MULTISET INTERSECT DISTINCT l_lookup;
IF l_diff.COUNT > 0 THEN
DBMS_OUTPUT.PUT_LINE('100 EXISTS');
ELSE
DBMS_OUTPUT.PUT_LINE('100 DOES NOT EXIST');
END IF;
END;
使用游标变量(REF CURSORs)
与游标一样,游标变量指向多行查询结果集中的当前行。游标变量更灵活,因为它不绑定到特定查询。您可以为返回正确列集的任何查询打开游标变量。
您将游标变量作为参数传递给本地和存储的子程序。在一个子程序中打开游标变量,并在不同的子程序中处理它,有助于集中数据检索。这种技术对于多语言应用程序也很有用,其中 PL/SQL 子程序可能会将结果集返回给用不同语言(如 Java 或 Visual Basic)编写的子程序。
什么是光标变量(REF CURSOR)?
游标变量就像指向结果集的指针。当您想在一个子程序中执行查询并在不同的子程序(可能是用不同语言编写的子程序)中处理结果时,可以使用它们。游标变量的数据类型为 REF CURSOR,您可能会看到它们被非正式地称为 REF CURSOR。
与始终引用同一个查询工作区的显式游标不同,游标变量可以引用不同的工作区。您不能在需要游标的地方使用游标变量,反之亦然。
来源:http ://docs.oracle.com/cd/B19306_01/appdev.102/b14261/sqloperations.htm#i7106
(Oracle 数据库 PL/SQL 用户指南和参考)