PLSQL入门与精通(第10章:游标简化写法)

像上次一样,用游标一行一行地取得,直到最后一行为止重复同样的处理,这样的模式可以用更简单的方法来记述:游标FOR循环语句。
因为很简单,如果可能的话建议使用游标FOR循环语句。

那么,我马上来解说游标FOR循环语句。比较上次的例子程序和用游标FOR循环处理改写了那个的情况。
分别为(A)、(B)。

(A)一般的记述
1 DECLARE
2 CURSOR CUR_EMP IS
3 SELECT EMPNO, ENAME FROM EMP
4 WERE DEPTNO=&部门编号;
5 REC CUR_EMP%ROWTYPE;
6 BEGIN
7 OPEN CUR_EMP;
8 LOOP
9 FETCH CUR_EMP INTO REC;
10 EXIT WHEN CUR_EMP%NOTFOUND;
11 DBMS_OUTPUT.PUT_LINE(REC.EMPNO || ’ ’ || REC.ENAME);
12 END LOOP;
13 CLOSE CUR_EMP;
14 END;

(B)使用光标FOR循环的描述
1 DECLARE
2 CURSOR CUR_EMP IS
3 SELECT EMPNO, ENAME FROM EMP
4 WERE DEPTNO=&部门编号;
5 BEGIN
6 FOR REC IN CUR_EMP LOOP
7 DBMS_OUTPUT.PUT_LINE(REC.EMPNO || ’ ’ || REC.ENAME);
8 END LOOP;
9 END;

首先,被称为游标FOR循环句的部分是(B)的第6~8行。语法如下所示:

FOR 记录变量名 IN 游标名 LOOP
使用记录变量的程序处理
END LOOP;

那么,使用这个语法的话,就可以简化处理,不需要各种各样的记述了:

【不需要的记述】
・记录变量声明(A)的第5行
・光标的开启处理(A)的第7行
・提取处理(A)的第9行
・循环结束处理(A)的第10行
・光标的关闭处理(A)的第13行

程序变简洁了,就像(B)那样可以用非常少的步数来写程序。
另外,游标FOR循环文中使用的记录变量(B)的第6行的REC),不需要在定义域进行提前定义也可以。
相反,记录变量只能在光标FOR循环句中引用。

可以更简单地做上面的(B)。那是直接记述用括号()代替光标FOR循环句的游标名的SELECT句的方法。

FOR 记录变量名 IN(SELECT・・・)LOOP
使用记录变量的程序处理
END LOOP;

使用该方法,执行部完全没有参考游标名,因此定义域的游标定义也不需要了。
定义域什么定义都没有的时候定义域本身也不需要。
以下这种形式的例子(C):

(C)游标未声明,游标FOR循环的描述
1 BEGIN
2 FOR REC IN(SELECT EMPNO,ENAME FROM EMP WHERE DEPTNO=&部门编号)LOOP
3 DBMS_OUTPUT.PUT_LINE(REC.EMPNO || ’ ’ || REC.ENAME);
4 END LOOP;
5 END;

(A)(B)(C)进行完全相同的处理,(A)是14行的记述,(C)是仅仅5行。简单得惊人。简单的话,程序也容易看,还能防止程序错误。

本次是针对游标使用的不同写法,大家可以尝试一下。

猜你喜欢

转载自blog.csdn.net/niusr_1980_01/article/details/113972287