ITPub博客

首页 > 数据库 > Oracle > Oracle 基础温习7 之 游标

Oracle 基础温习7 之 游标

原创 Oracle 作者:starive 时间:2014-02-07 12:28:21 0 删除 编辑

  1. CREATE TABLE Student
  2.        (Sno CHAR(9) PRIMARY KEY,
  3.         Sname CHAR(20) NOT NULL,
  4.         Ssex CHAR(4),
  5.         Sage SMALLINT,
  6.         Sdept CHAR(20)) tablespace gaospace;

如上面student表的定义。
游标定义:  cursor 游标名 is select 语句;

  1. declare
  2.    v_student_name char(20);
  3. Cursor c_student is select sname from student;
  4. begin
  5.   open c_student;
  6. loop
  7.  fetch c_student into v_student_name;
  8. exit when c_student%notfound;
  9. dbms_output.put_line(v_student_name);
  10. end loop;
  11. close c_student;
  12. end;

发现在记事本里面敲入上面的代码,然后再粘贴复制到sqlplus上面去,报错:
*
第 3 行出现错误:
ORA-06550: 第 3 行, 第 1 列:
PLS-00103: 出现符号 "?"在需要下列之一时:
begin function
pragma procedure subtype type
current cursor delete
exists prior
符号 "?" 被忽略。
ORA-06550: 第 4 行, 第 1 列:
PLS-00103: 出现符号 "?"在需要下列之一时:
begin function
pragma procedure subtype type
current cursor delete
exists prior


如果是 一个字一个字在sqlplus里面敲入,可以正常输出:

  1. SQL> declare
  2.   2 v_student_name char(20);
  3.   3 cursor c_student is select sname from student;
  4.   4 begin
  5.   5 open c_student;
  6.   6 loop
  7.   7 fetch c_student into v_student_name;
  8.   8 exit when c_student%notfound;
  9.   9 dbms_output.put_line(v_student_name);
  10.  10 end loop;
  11.  11 close c_student;
  12.  12 end;
  13.  13 /

  14. PL/SQL 过程已成功完成。

但是没有结果输出。查询了显示器,需要如下设置:

  1. set serveroutput on;

然后再执行:

  1. SQL> declare
  2.   2 v_student_name char(20);
  3.   3 cursor c_student is select sname from student;
  4.   4 begin
  5.   5 open c_student;
  6.   6 loop
  7.   7 fetch c_student into v_student_name;
  8.   8 exit when c_student%notfound;
  9.   9 dbms_output.put_line(v_student_name);
  10.  10 end loop;
  11.  11 close c_student;
  12.  12 end;
  13.  13 /
  14. 赵伟
  15. 张力虹
  16. 徐秀美
  17. 刘平
  18. 姚家全
  19. 上关美云

  20. PL/SQL 过程已成功完成。

  21. SQL>


题二:
如果student表里面有人的年龄小于18岁,将其更改为18岁。

  1. INSERT INTO Student VALUES(\'0208\',\'赵伟\',\'男\',10,\'cs\');


  1. SQL> declare
  2.   2 cursor v_age is select sage from student
  3.   3 for update of sage;
  4.   4 begin
  5.   5 for v_record in v_age loop
  6.   6 if v_record.sage<18 then
  7.   7 update student set sage=18 where current of v_age;
  8.   8 end if;
  9.   9 end loop;
  10.  10 commit;
  11.  11 end;
  12.  12 /

  13. PL/SQL 过程已成功完成。

  14. SQL> select * from student;

  15. SNO SNAME SSEX SAGE
  16. ------------------ ---------------------------------------- -------- ----------
  17. SDEPT
  18. ----------------------------------------
  19. 0201 赵伟 男 18
  20. cs

  21. 0202 张力虹 男 19
  22. is

  23. 0203 徐秀美 女 21
  24. is


  25. SNO SNAME SSEX SAGE
  26. ------------------ ---------------------------------------- -------- ----------
  27. SDEPT
  28. ----------------------------------------
  29. 0204 刘平 男 20
  30. cs

  31. 0205 姚家全 男 19
  32. cs

  33. 0206 上关美云 女 23
  34. ma


  35. SNO SNAME SSEX SAGE
  36. ------------------ ---------------------------------------- -------- ----------
  37. SDEPT
  38. ----------------------------------------
  39. 0208 赵伟 男 18
  40. cs


可以看出赵伟的年龄已经改为 18了。

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

请登录后发表评论 登录
全部评论

注册时间:2014-01-18

  • 博文量
    143
  • 访问量
    492013