加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码网 (https://www.900php.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

oracle中的cursor

发布时间:2021-01-24 18:06:33 所属栏目:百科 来源:网络整理
导读:副标题#e# ? ?游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库。这样数据处


说明:该程序通过定义游标emp_cursor,提取并显示雇员7788的名称和职务。?
作为对以上例子的改进,在以下训练中采用了记录变量。?
【训练2】? 用游标提取emp表中7788雇员的姓名、职务和工资。?

Sql代码?
  1. SET?SERVEROUTPUT?ON??
  2. ????????DECLARE??
  3. ?????????CURSOR?emp_cursor?IS??SELECT?ename,job,sal?FROM?emp?WHERE?empno=7788; ??
  4. ?????????emp_record?emp_cursor%ROWTYPE; ??
  5. ????????BEGIN??
  6. OPEN?emp_cursor;???? ??
  7. ????????FETCH?emp_cursor?INTO?emp_record; ??
  8. ???????????DBMS_OUTPUT.PUT_LINE(emp_record.ename||‘,‘||?emp_record.job||‘,‘||?emp_record.sal); ??
  9. ?????????CLOSE?emp_cursor; ??
  10. ????????END;??


执行结果为:?

Sql代码?
  1. SCOTT,ANALYST,3000 ??
  2. ????????PL/SQL?过程已成功完成。???


说明:实例中使用记录变量来接收数据,记录变量由游标变量定义,需要出现在游标定义之后。?
注意:可通过以下形式获得记录变量的内容:?
记录变量名.字段名。?
【训练3】? 显示工资最高的前3名雇员的名称和工资。?

Sql代码?
  1. SET?SERVEROUTPUT?ON??
  2. ????????DECLARE??
  3. ?????????V_ename?VARCHAR2(10); ??
  4. ????????V_sal?NUMBER(5); ??
  5. ????????CURSOR?emp_cursor?IS??SELECT?ename,sal?FROM?emp?ORDER?BY?sal?DESC; ??
  6. ????????BEGIN??
  7. ?????????OPEN?emp_cursor; ??
  8. ?????????FOR?I?IN?1..3?LOOP ??
  9. ???????????FETCH?emp_cursor?INTO?v_ename,v_sal; ??
  10. ?????????DBMS_OUTPUT.PUT_LINE(v_ename||‘,‘||v_sal); ??
  11. ??????????END?LOOP; ??
  12. ?????????CLOSE?emp_cursor; ??
  13. ?????????END;??


执行结果为:?

Sql代码?
  1. KING,5000 ??
  2. ?????SCOTT,3000 ??
  3. ?????FORD,3000 ??
  4. ?????PL/SQL?过程已成功完成。??


? 说明:该程序在游标定义中使用了ORDER BY子句进行排序,并使用循环语句来提取多行数据。?
游标循环?
【训练1】? 使用特殊的FOR循环形式显示全部雇员的编号和名称。?

Sql代码?
  1. SET?SERVEROUTPUT?ON??
  2. DECLARE??
  3. ??CURSOR?emp_cursor?IS? ??
  4. ??SELECT?empno,?ename?FROM?emp; ??
  5. BEGIN??
  6. FOR?Emp_record?IN?emp_cursor?LOOP??? ??
  7. ????DBMS_OUTPUT.PUT_LINE(Emp_record.empno||?Emp_record.ename); ??
  8. ????END?LOOP; ??
  9. ????END;??


执行结果为:?

Sql代码?
  1. 7369SMITH ??
  2. 7499ALLEN ??
  3. 7521WARD ??
  4. 7566JONES ??
  5. ?????????PL/SQL?过程已成功完成。??


? 说明:可以看到该循环形式非常简单,隐含了记录变量的定义、游标的打开、提取和关闭过程。Emp_record为隐含定义的记录变量,循环的执行次数与游标取得的数据的行数相一致。?
【训练2】? 另一种形式的游标循环。?

Sql代码?
  1. SET?SERVEROUTPUT?ON? ??
  2. BEGIN??
  3. ?FOR?re?IN?(SELECT?ename?FROM?EMP)??LOOP ??
  4. ??DBMS_OUTPUT.PUT_LINE(re.ename) ??
  5. ?END?LOOP; ??
  6. END;??


执行结果为:?

Sql代码?
  1. SMITH ??
  2. ALLEN ??
  3. WARD ??
  4. JONES??


??? 说明:该种形式更为简单,省略了游标的定义,游标的SELECT查询语句在循环中直接出现。?
显式游标属性?
虽然可以使用前面的形式获得游标数据,但是在游标定义以后使用它的一些属性来进行结构控制是一种更为灵活的方法。显式游标的属性如下所示。?

Sql代码?
  1. 游标的属性???返回值类型???意????义 ??
  2. %ROWCOUNT???整型??获得FETCH语句返回的数据行数 ??
  3. %FOUND??布尔型?最近的FETCH语句返回一行数据则为真,否则为假 ??
  4. %NOTFOUND???布尔型?与%FOUND属性返回值相反 ??
  5. %ISOPEN?布尔型?游标已经打开时值为真,否则为假??


可按照以下形式取得游标的属性:?
游标名%属性?
要判断游标emp_cursor是否处于打开状态,可以使用属性emp_cursor%ISOPEN。如果游标已经打开,则返回值为“真”,否则为“假”。具体可参照以下的训练。?
【训练1】? 使用游标的属性练习。?

Sql代码?
  1. SET?SERVEROUTPUT?ON??
  2. DECLARE??
  3. ??V_ename?VARCHAR2(10); ??
  4. ??CURSOR?emp_cursor?IS? ??
  5. ??SELECT?ename?FROM?emp; ??
  6. BEGIN??
  7. ?OPEN?emp_cursor; ??
  8. ?IF?emp_cursor%ISOPEN?THEN??
  9. LOOP ??
  10. ???FETCH?emp_cursor?INTO?v_ename; ??
  11. ???EXIT?WHEN?emp_cursor%NOTFOUND; ??
  12. ???DBMS_OUTPUT.PUT_LINE(to_char(emp_cursor%ROWCOUNT)||‘-‘||v_ename); ??
  13. ??END?LOOP; ??
  14. ?ELSE??
  15. ??DBMS_OUTPUT.PUT_LINE(‘用户信息:游标没有打开!‘); ??
  16. ?END?IF; ??
  17. ?CLOSE??emp_cursor; ??
  18. END;??

(编辑:源码网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读