游标表达式

 游标表达式

OracleSQL语言中提供了一个强有力的工具:游标表达式。一个游标表达式从一个查询中返回一个内嵌的游标。在这个内嵌游标的结果集中,每一行数据包含了在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;
/

 

附图:

27042095_201208131222471.jpg

27042095_201208131223001.jpg

fj.png游标表达式.jpg

fj.png游标表达式2.jpg

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27042095/viewspace-740847/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/27042095/viewspace-740847/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值