Oracle在SQL语言中提供了一个强有力的工具:游标表达式。一个游标表达式从一个查询中返回一个内嵌的游标。在这个内嵌游标的结果集中,每一行数据包含了在SQL查询中的可允许的数值范围;它也能包含被其他子查询所产生的游标。
因此,你能够使用游标表达式来返回一个大的和复杂的,从一张或多张表获取的数据集合。游标表达式的复杂程度,取决于查询和结果集。然而,了解所有从Oracle RDBMS提取数据的可能途径,还有大有好处的。
You can use cursor expressions in any of the following:
你能够在以下任何一种情况使用游标表达式:
l 显式游标声明
l 动态SQL查询。
l REF CURSOR 声明和变量。
你不能在一个隐式查询中使用游标表达式。
游标表达式的语法是相当简单的:
CURSOR (subquery)
当Oracle从父游标或外围游标那里检取包含游标表达式的数据行时,Oracle就会隐式地打开一个内嵌的游标,这个游标就是被上述的游标表达式所定义。在以下情况发生时,这个内迁游标将会被关闭:
l 你显式地关闭这个游标。
l 外围或父游标被重新执行,关闭或撤销。
l 当从父游标检取数据时,发生异常。内嵌游标就会与父游标一起被关闭。
1.1.1 使用游标表达式
你可以通过两种不同的,但是非常有用的方法来使用游标表达式:
1. 在一个外围查询中把字查询作为一列来检取数据。
2. 把一个查询转换成一个结果集,而这个结果集就可以被当成一个参数传递给一个流型或变换函数。
1.1.1.1 把子查询作为列检取数据
下面这个过程(HR模式)展示了使用内嵌CURSOR表达式来获取子查询数据的方法。最外层的查询取出数据的两个部分:城市的地址和一个内嵌游标——其包含了在这个城市的部门。这个内嵌游标,依次地从更深一层的内嵌游标中取出数据,其包含了在每一个部门中的所有雇员。
我当然也可以创建并操作多个独立的游标来获取信息。但是,CURSOR表达式给我们使用一个完全不同方法的机会,这个方法更精确和高效,它使所有的操作都在SQL语句执行器中完成,并且减少了上下文的交互。
CREATE OR REPLACE PROCEDURE emp_report(p_locid NUMBER)
IS
TYPE refcursor IS REF CURSOR;
CURSOR all_in_one IS
SELECT l.city, CURSOR(
SELECT d.department_name, CURSOR (
SELECT e.last_name
FROM employees e
WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID
) as ename
FROM departments d
WHERE d.LOCATION_ID = l.LOCATION_ID
) as dname
FROM locations l
WHERE l.location_id = p_locid;
departments_cur refcursor;
employees_cur refcursor;
v_city locations.city%type;
v_dname departments.department_name%type;
v_ename employees.last_name%type;
i integer :=1;
j integer :=1;
k integer :=1;
BEGIN
OPEN all_in_one;
LOOP
FETCH all_in_one INTO v_city, departments_cur;
EXIT WHEN all_in_one%NOTFOUND;
LOOP
FETCH departments_cur INTO v_dname, employees_cur;
EXIT WHEN departments_cur%NOTFOUND;
LOOP
FETCH employees_cur INTO v_ename;
EXIT WHEN employees_cur%NOTFOUND;
dbms_output.put_line(i || ' , ' || j || ' , ' || k || '----' || v_city || ' ,' || v_dname || ' ,' || v_ename );
k := k + 1;
END LOOP;
j := j + 1;
END LOOP;
i := i + 1;
END LOOP;
END;
/
附图:
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27042095/viewspace-740847/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/27042095/viewspace-740847/