PL/SQL程序之光标

转载来自: http://blog.csdn.net/w_l_j/article/details/7380495
  1. 1、说明光标语法:  
  2. CURSOR  光标名  [ (参数名  数据类型[,参数名 数据类型]...)]  IS  SELECT   语句;  
  3. 2、用于存储一个查询返回的多行数据  
  4. 3、打开光标:                 open c1;    (打开光标执行查询)  
  5. 4、  取一行光标的值:fetch c1 into pjob; (取一行到变量中)  
  6. 5、关闭光标:          close  c1;(关闭游标释放资源)  
  7. 6、注意: 上面的pjob必须与emp表中的job列类型一致:    定义:pjob emp.job%type;  
  8.   
  9. 例一:按职工的职称长工资,总裁1000元,经理800元,其他人员长400元  
  10. Java程序  
  11. SQL> update emp set sal = (  
  12. case job when 'PRESIDENT' then sal+1000  
  13. when 'MANGER' then sal+800  
  14. else sal+400  
  15. end);  
  16.   
  17. PL/SQL程序  
  18. declare  
  19. --定义光标   查询empno以及job岗位  
  20. cursor c1 is select empno,job from emp;  
  21. --声明一个变量   此变量与emp表中的job字段类型一致  
  22. emp_job emp.job%type;  
  23. --声明一个变量   此变量与emp表中的empno字段类型一致  
  24. emp_empno emp.empno%type;  
  25. --开始  
  26. begin  
  27.  --打开光标  
  28.  open c1;  
  29.  --循环开始  
  30.  loop   
  31.    --取出光标  
  32.    fetch c1 into emp_empno,emp_job;  
  33.    exit when c1%notfound;--判断光标是否存在  如果存在  则往下执行  否则  不执行  
  34.      
  35.    if emp_job='PRESIDENT' then update emp set sal =sal+1000 where empno=emp_empno;  
  36.    elsif emp_job='MANAGER' then update emp set sal =sal+800 where empno=emp_empno;  
  37.    else  update emp set sal =sal+1000 where empno=emp_empno;  
  38.    end if;  
  39.    end loop;--退出循环  
  40.    close c1;--关闭光标  
  41.    end;--结束标识  
  42.   
  43. 例二:找出7369的职位  
  44. declare  
  45.  emp_job emp.job%type;  
  46. begin  
  47.  select job into emp_job from emp where empno=7369;-----into方法,把查询出来的job  名放到emp_job中  
  48.  dbms_output.put_line(emp_job);  
  49. end;  
  50.   
  51. 找出emp中的所有职位  
  52.  declare  
  53. --定义光标   查询job岗位  
  54. cursor c1 is select job from emp;  
  55. --声明一个变量   此变量与emp表中的job字段类型一致  
  56. emp_job emp.job%type;  
  57. --开始  
  58. begin  
  59.  --打开光标  
  60.  open c1;  
  61.  --循环开始  
  62.  loop   
  63.    --取出光标  
  64.    fetch c1 into emp_job;  
  65.    exit when c1%notfound;--判断光标是否存在  如果存在  则往下执行  否则  不执行  
  66.    dbms_output.put_line(emp_job);  
  67.    end loop;--退出循环  
  68.    close c1;--关闭光标  
  69.    end;--结束标识  
  70.   
  71. 例三:查找出所有的ename  
  72. declare  
  73. cursor c1 is select * from emp;  
  74. emp_row emp%rowtype;  
  75. begin  
  76. open c1;  
  77. loop  
  78. fetch c1 into emp_row;  
  79. exit when c1%notfound;  
  80. dbms_output.put_line(emp_row.ename);  
  81. end loop;  
  82. close c1;  
  83. end;  
  84. 例四:查询部门号为10的员工信息  
  85. declare  
  86. cursor c1 (emp_deptno number) is select * from emp where deptno=emp_deptno;  
  87. emp_row emp%rowtype;  
  88. begin  
  89. open c1(10);  
  90. dbms_output.put_line('部门号为10的员工信息');  
  91. loop  
  92.      fetch c1 into emp_row;  
  93.      exit when c1%notfound;  
  94.      dbms_output.put_line('员工编号'||emp_row.empno||'员工姓名'|| emp_row.ename||'员工工资'|| emp_row.sal||'员工部门编   
  95. 号'||emp_row.deptno);  
  96. end loop;  
  97. close c1;  
  98. end;  
  99. 结果:  
  100. 部门号为10的员工信息  
  101. 员工编号7782员工姓名CLARK员工工资2450员工部门编号10  
  102. 员工编号7839员工姓名KING员工工资5000员工部门编号10  
  103. 员工编号7934员工姓名MILLER员工工资1300员工部门编号10  
  104. 带参数的光标  
  105. 例五:带有参数光标的练习  
  106. SQL> declare  
  107.   2  cursor c1(emp_deptno number) is select * from emp where deptno=emp_deptno;  
  108.   3  emp_row emp%rowtype;  
  109.   4  begin  
  110.   5  open c1(10);  
  111.   6  loop  
  112.   7  fetch c1 into emp_row;  
  113.   8  exit when c1%notfound ;  
  114.   9  dbms_output.put_line('员工的名称'|| emp_row.ename || emp_row.job);  
  115.  10  end loop;  
  116.  11  close c1;  
  117.  12  end;  
  118.  13  /  
  119.  结果:  
  120. 员工的名称CLARKMANAGER  
  121. 员工的名称KINGPRESIDENT  
  122. 员工的名称MILLERCLERK  
  123.   
  124. <p><strong><span style="color:red;">特别注意:</span></strong></p><p>在打开游标之前最好先判断游标是否已经是打开的。</p><p>通过ISOPEN判断,格式:</p><p>游标%ISOPEN</p><p>IF mycur%ISOPEN  </p><p>THEN </p><p>null ; </p><p>ELSE </p><p>OPENmycur ; </p><p>END IF ;</p> 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值