Oracle 基礎溫習7 之 遊標

starive發表於2014-02-07

  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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章