资源描述:
《oracle游标使用大全33021》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Oracle游标使用大全www.net130.com 日期:2006-5-29 浏览次数:21058出处:赛迪网 显式游标 当查询返回结果超过一行时,就需要一个显式游标,此时用户不能使用selectinto语句。PL/SQL管理隐式游标,当查询开始时隐式游标打开,查询结束时隐式游标自动关闭。显式游标在PL/SQL块的声明部分声明,在执行部分或异常处理部分打开,取数据,关闭。使用游标 这里要做一个声明,我们所说的游标通常是指显式游标,因此从现在起没有特别指明的情况,我们所说的游标都是指显式游标。要在程序中使用游标,必须首先声明游标。声
2、明游标语法: CURSORcursor_nameISselect_statement;在PL/SQL中游标名是一个未声明变量,不能给游标名赋值或用于表达式中。例: DELCARE CURSORC_EMPISSELECTempno,ename,salary FROMemp WHEREsalary>2000 ORDERBYename; ........ BEGIN 在游标定义中SELECT语句中不一定非要表可以是视图,也可以从多个表或视图中选择的列,甚至可以使用*来选择所有的列。 打开游标使用游标中的值之前应该首先打开游标,打开游标初始化查询处
3、理。打开游标的语法是: OPENcursor_name cursor_name是在声明部分定义的游标名。 例: OPENC_EMP;关闭游标语法: CLOSEcursor_name 例: CLOSEC_EMP;从游标提取数据 从游标得到一行数据使用FETCH命令。每一次提取数据后,游标都指向结果集的下一行。语法如下: FETCHcursor_nameINTOvariable[,variable,...] 对于SELECT定义的游标的每一列,FETCH变量列表都应该有一个变量与之相对应,变量的类型也要相同。 例: SETSERVERIUTPU
4、TON DECLARE v_enameEMP.ENAME%TYPE; v_salaryEMP.SALARY%TYPE; CURSORc_empISSELECTename,salaryFROMemp; BEGIN OPENc_emp; FETCHc_empINTOv_ename,v_salary; DBMS_OUTPUT.PUT_LINE('SalaryofEmployee'
5、
6、v_ename
7、
8、'is'
9、
10、v_salary); FETCHc_empINTOv_ename,v_salary; DBMS_
11、OUTPUT.PUT_LINE('SalaryofEmployee'
12、
13、v_ename
14、
15、'is'
16、
17、v_salary); FETCHc_empINTOv_ename,v_salary; DBMS_OUTPUT.PUT_LINE('SalaryofEmployee'
18、
19、v_ename
20、
21、'is'
22、
23、v_salary); CLOSEc_emp; END 这段代码无疑是非常麻烦的,如果有多行返回结果,可以使用循环并用游标属性为结束循环的条件,以这种方式提取数据,程序的可读性和简洁性都大为提高,下面我们使用循环重新写上面
24、的程序:SETSERVERIUTPUTONDECLAREv_enameEMP.ENAME%TYPE;v_salaryEMP.SALARY%TYPE;CURSORc_empISSELECTename,salaryFROMemp;BEGINOPENc_emp; LOOP FETCHc_empINTOv_ename,v_salary; EXITWHENc_emp%NOTFOUND; DBMS_OUTPUT.PUT_LINE('SalaryofEmployee'
25、
26、v_ename
27、
28、'is'
29、
30、v_salary);END记录变量 定义一个记
31、录变量使用TYPE命令和%ROWTYPE,关于%ROWsTYPE的更多信息请参阅相关资料。 记录变量用于从游标中提取数据行,当游标选择很多列的时候,那么使用记录比为每列声明一个变量要方便得多。 当在表上使用%ROWTYPE并将从游标中取出的值放入记录中时,如果要选择表中所有列,那么在SELECT子句中使用*比将所有列名列出来要得多。 例:SETSERVERIUTPUTONDECLARER_empEMP%ROWTYPE;CURSORc_empISSELECT*FROMemp;BEGINOPENc_emp; LOOP FETCHc_empINTOr
32、_emp; EXITWHENc_emp%NOTFOUND; DBMS_OUT.PUT.PUT_LINE('SalaryofEmployee'
33、
34、r_e