Oracle游标使用攻略

Sql代码
1.

从游标提取数据
2. 从游标失去一起数据运用FETCH下令。每一次提取数据后,游标都指向结果集的下一起。语法如次:
3. FETCH cursor_name INTO variable[,variable,...]
4. 至于SELECT定义的游标的每一列,FETCH变量列表都应该有一个变量与之相对应,变量的部类也要雷同。

 

例:
5. SET SERVERIUTPUT ON
6. DECLARE
7. v_ename EMP.ENAME%TYPE;
8. v_salary EMP.SALARY%TYPE;
9. CURSOR c_emp IS SELECT ename,salary FROM emp;
10. BEGIN
11. OPEN c_emp;
12. FETCH c_emp INTO v_ename,v_salary;
13. DBMS_OUTPUT.PUT_LINE('Salary of Employee'|| v_ename ||'is'|| v_salary);
14. FETCH c_emp INTO v_ename,v_salary;
15. DBMS_OUTPUT.PUT_LINE('Salary of Employee'|| v_ename ||'is'|| v_salary);
16. FETCH c_emp INTO v_ename,v_salary;
17. DBMS_OUTPUT.PUT_LINE('Salary of Employee'|| v_ename ||'is'|| v_salary);
18. CLOSE c_emp;
19. END
20.
21. 这段代码无疑是非曲直常劳驾的,如果有多行回到结果,可以运用循环并用游标属性为终结循环的条件,以这种形式提取数据,程序的可读性和简洁性都极为拔高,下部我们运用循环从新写上头的程序:
22.SET SERVERIUTPUT ON
23.DECLARE
24.v_ename EMP.ENAME%TYPE;
25.v_salary EMP.SALARY%TYPE;
26.CURSOR c_emp IS SELECT ename,salary FROM emp;
27.BEGIN
28.OPEN c_emp;
29. LOOP
30. FETCH c_emp INTO v_ename,v_salary;
31. EXIT WHEN c_emp%NOTFOUND;
32. DBMS_OUTPUT.PUT_LINE('Salary of Employee'|| v_ename ||'is'|| v_salary);
33.END
34.
35.记要变量
36. 定义一个记要变量运用TYPE下令和%ROWTYPE,对于%ROWsTYPE的更多信息请参阅有关文件。
37. 记要变量用来从游标中提取数据行,应游标取舍很多列的时分,那么施用记要比为每列宣言一个变量要便利得多。
38. 当在表上运用%ROWTYPE并将从游标中掏出的值放入记要中时,如其要取舍表中全部列,那么在SELECT子句中应用*比将全部列名列出来要得多。

 

例:
39.SET SERVERIUTPUT ON
40.DECLARE
41.R_emp EMP%ROWTYPE;
42.CURSOR c_emp IS SELECT * FROM emp;
43.BEGIN
44.OPEN c_emp;
45. LOOP
46. FETCH c_emp INTO r_emp;
47. EXIT WHEN c_emp%NOTFOUND;
48. DBMS_OUT.PUT.PUT_LINE('Salary of Employee'||r_emp.ename||'is'|| r_emp.salary);
49. END LOOP;
50.CLOSE c_emp;
51.END;

 

%ROWTYPE也可以用游标名来定义,这么的话就必须要第一宣言游标:

 

SET SERVERIUTPUT ON
52.DECLARE
53.CURSOR c_emp IS SELECT ename,salary FROM emp;
54.R_emp c_emp%ROWTYPE;
55.BEGIN
56.OPEN c_emp;
57.LOOP
58. FETCH c_emp INTO r_emp;
59. EXIT WHEN c_emp%NOTFOUND;
60. DBMS_OUT.PUT.PUT_LINE('Salary of Employee'||r_emp.ename||'is'|| r_emp.salary);
61.END LOOP;
62.CLOSE c_emp;
63.END;
64.
65.带参数的游标
66. 与储存进程和函数形似,可以将参数传接给游标并在查询中运用。这关于处置在某种条件下打开游标的状况十分有用。它的语法如次:

 

CURSOR cursor_name[(parameter[,parameter],...)] IS select_statement;

 

定义参数的语法如次:
67. Parameter_name [IN] data_type[{:=|DEFAULT} value]

 

  与储存历程不同的是,游标唯其如此接受传接的值,而不能回到值。参数只定义数据部类,没大小。
68.  此外可以给参数设定一个缺省值,应没参数值传接给游标时,就施用缺省值。游标中定义的参数只是一个占位符,在别处摘引该参数不见得靠得住。

 

在打开游标时给参数赋值,语法如次:

 

OPEN cursor_name[value[,value]....];
69.参数值可以是文字或变量。

 

例:
70.DECALRE
71.CURSOR c_dept IS SELECT * FROM dept ORDER BY deptno;
72.CURSOR c_emp (p_dept VARACHAR二) IS
73.SELECT ename,salary
74.FROM emp
75.WHERE deptno=p_dept
76.ORDER BY ename
77.r_dept DEPT%ROWTYPE;
78.v_ename EMP.ENAME%TYPE;
79.v_salary EMP.SALARY%TYPE;
80.v_tot_salary EMP.SALARY%TYPE;
81.BEGIN
82.OPEN c_dept;
83. LOOP
84. FETCH c_dept INTO r_dept;
85. EXIT WHEN c_dept%NOTFOUND;
86. DBMS_OUTPUT.PUT_LINE('Department:'|| r_dept.deptno||'-'||r_dept.dname);
87. v_tot_salary:=零;
88. OPEN c_emp(r_dept.deptno);
89. LOOP
90. FETCH c_emp INTO v_ename,v_salary;
91. EXIT WHEN c_emp%NOTFOUND;
92. DBMS_OUTPUT.PUT_LINE('Name:'|| v_ename||' salary:'||v_salary);
93. v_tot_salary:=v_tot_salary+v_salary;
94. END LOOP;
95. CLOSE c_emp;
96. DBMS_OUTPUT.PUT_LINE('Toltal Salary for dept:'|| v_tot_salary);
97. END LOOP;
98.CLOSE c_dept;
99.END;
100.
101.游标FOR循环
102.在大部分时分我们在设计程序的时分都遵照下部的方法:
103.1、打开游标
104.2、开始循环
105.3、从游标中取值
106.那一起被回到
107.5、处置
108.6、封锁循环
109.7、封锁游标
110. 可以容易的把这一类代码称做游标用以循环。但再有一种循环与这类别型不相同,这便是FOR循环,用来FOR循环的游标依照一般的宣言模式宣言,它的优点取决于不需要显式的打开、封闭、取数据,测试数据的存在、定义寄放数据的变量之类。游标FOR循环的语法如次:

 

FOR record_name IN
111.(corsor_name[(parameter[,parameter]...)]
112.| (query_difinition)
113.LOOP
114.statements
115.END LOOP;

 

下部我们用for循环重写上边的事例:
116.DECALRE
117.CURSOR c_dept IS SELECT deptno,dname FROM dept ORDER BY deptno;
118.CURSOR c_emp (p_dept VARACHAR二) IS
119.SELECT ename,salary
120.FROM emp
121.WHERE deptno=p_dept
122.ORDER BY ename
123.v_tot_salary EMP.SALARY%TYPE;
124.BEGIN
125. FOR r_dept IN c_dept LOOP
126. DBMS_OUTPUT.PUT_LINE('Department:'|| r_dept.deptno||'-'||r_dept.dname);
127. v_tot_salary:=零;
128. FOR r_emp IN c_emp(r_dept.deptno) LOOP
129. DBMS_OUTPUT.PUT_LINE('Name:' || v_ename || 'salary:' || v_salary);
130. v_tot_salary:=v_tot_salary+v_salary;
131. END LOOP;
132. DBMS_OUTPUT.PUT_LINE('Toltal Salary for dept:'|| v_tot_salary);
133.END LOOP;
134.END;
135.
136.
在游标FOR循环中施用查询
137.
在游标FOR循环中可以定义查询,因为没显式宣言之所以游标没名字,记要名经过游标查询来定义。
138.DECALRE
139.v_tot_salary EMP.SALARY%TYPE;
140.BEGIN
141.FOR r_dept IN (SELECT deptno,dname FROM dept ORDER BY deptno) LOOP
142. DBMS_OUTPUT.PUT_LINE('Department:'|| r_dept.deptno||'-'||r_dept.dname);
143. v_tot_salary:=零;
144. FOR r_emp IN (SELECT ename,salary
145.    FROM emp
146.    WHERE deptno=p_dept
147.    ORDER BY ename) LOOP
148. DBMS_OUTPUT.PUT_LINE('Name:'|| v_ename||' salary:'||v_salary);
149. v_tot_salary:=v_tot_salary+v_salary;
150. END LOOP;
151.DBMS_OUTPUT.PUT_LINE('Toltal Salary for dept:'|| v_tot_salary);
152.END LOOP;
153.END;

 

游标中的子查询
154. 语法如次:
155.
156.CURSOR C一 IS SELECT * FROM emp
157.WHERE deptno NOT IN (SELECT deptno
158. FROM dept
159. WHERE dname!='ACCOUNTING');
160.可以看出与SQL中的子查询没有什么区别。


本文来源:
我的异常网
Java Exception
Dotnet Exception
Oracle Exception

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值