今天老师出了一道题,意思就是:怎么从过程中返回数据集。
下面是我使用的一个方法:
包:
CREATE OR REPLACE PACKAGE pkg_type IS
TYPE my_cur IS REF CURSOR;
END;
包比较类似于JAVA中的包+接口,在本例中是定义了一个游标类型,供外部使用.
过程:
CREATE OR REPLACE PROCEDURE sp_get_dataset(
p_deptno dept.deptno%TYPE,
p_cur OUT pkg_type.my_cur
)
AS
BEGIN
OPEN p_cur FOR
SELECT * FROM emp WHERE emp.deptno=p_deptno;
END;
我们可以看到过程中定义了2个参数,其中第2个参数为OUT,意思是该参数不能接收值,只能对外提供数据,我们用他来返回数据集,同时把他的类型定义为前面包中定义的类型,用'包名.类名',块中其实就是一个游标FOR循环.
外部调用:
DECLARE
my_cur pkg_type.my_cur;
my_row emp%ROWTYPE;
BEGIN
scott.sp_get_dataset(10,my_cur);
FETCH my_cur INTO my_row;
WHILE(my_cur%FOUND)
LOOP
dbms_output.put_line(my_row.empno||'->'||my_row.ename);
FETCH my_cur INTO my_row;
END LOOP;
CLOSE my_cur;
END;
为了能够接收过程中返回来的数据,我们将定义一个与返回数据类型相同的变量,同时定义了一个行变量用于取数据,在块中调用过程的时候,因为第2个参数不能接收数据,但可以向外提供数据,所以我们在参数传递的时候给第2个参数传入游标对象,意思是将过程中返回的数据赋值给该对象以供我们使用,接下来就是传统的游标使用方式.
今天的主要内容是复习前面学习到的常用知识点,总的来说难度不大,自己加压,不过还是有收获,比如不太熟悉的异常处理,在今天彻底解决了,归纳如下: