- 1.语法
CURSOR cursor_name[(parameter_name datatype,...)]IS select_statement; --游标关联的SELECT语句,该语句不能使用SELECT...INTO...语句
- 使用步骤
1.声明游标
DECLARE CURSOR cursor_nameIS SELECT_STATEMENT
2.打开游标
OPEN cursor_name
3.读取数据:读取数据需要利用FETCH语句完成,但是FETCH只能取出当前行的记录,正常情况下FETCH要和循环语句一起使用,这样指针会不断前进,直到某个条件不符合要求而退出.使用FETCH时,游标属性%ROWCOUNT会不断累加.
FETCH cursor_name INTO record_name
4.关闭游标
CLOSE cursor_name
5.例
DECLARE CURSOR pdct_cur IS SELECT * FROM productinfo; cur_prodrcd productinfo%ROWTYPE;BEGIN OPEN pdct_cur; FETCH pdct_cur INTO cur_prodrcd; DBMS_OUTPUT.PUT_LINE(cur_prodrcd.productid || '-' || cur_prodrcd.productname); CLOSE pdct_cur;END;
- 显示游标的属性
1.%ISOPEN:判断游标是否打开,打开则返回true
2.%FOUND:检测行数据是否有效,有效则返回true
3.%NOTFOUND:
4.%ROWCOUNT:累计到当前为止使用FETCH提取数据的行数
- 游标的使用技巧
1.游标中使用LOOP
DECLARE CURSOR pdct_loop_cur IS SELECT productid,productname,productprice FROM productinfo WHERE productprice>2500; cur_productid productinfo.productid%TYPE; cur_productname productinfo.productname%TYPE; cur_productprice productinfo.productprice%TYPE;BEGIN OPEN pdct_loop_cur; LOOP FETCH pdct_loop_cur INTO cur_productid,cur_productname,cur_productprice; EXIT WHEN pdct_loop_cur%NOTFOUND; DBMS_OUTPUT.PUT_LINE('产品ID' || cur_productid); END LOOP; CLOSE pdct_loop_cur;END;
2.使用BULK COLLECT和FOR语句:通常使用FETCH...INTO...语句提取数据,这种方式是单条提取数据,在数据量很大的情况下执行的效率不是很理想。而FETCH...BULK COLLECT INTO语句可以批量提取数据。
DECLARE CURSOR pdct_collect_cur IS SELECT * FROM productinfo; TYPE pdct_tab IS TABLE OF productinfo%ROWTYPE; pdct_rd pdct_tab;BEGIN OPEN pdct_collect_cur; LOOP FETCH pdct_collect_cur BULK COLLECT INTO pdct_rd LIMIT 2; FOR i IN 1..pdct_rd.COUNT LOOP DBMS_OUTPUT.PUT_LINE('产品ID' || pdct_rd(i).productid); EXIT WHEN pdct_collect_cur%NOTFOUND; END LOOP; END LOOP; CLOSE pdct_collect_cur;END;
3.CURSOR FOR LOOP:不需要特别的声明变量,它可以提取出行对象类型的数据
DECLARE CURSOR cfl IS SELECT productname,productprice FROM productinfo;BEGIN FOR curcfl IN cfl --curcfl不需要声明,它可以提取出行对象的类型的数据,是一个%ROWTYPE类型 LOOP DMS_OUTPUT.PUT_LINE('名称: ' || curcfl.productname); END LOOP;END;
- 带参的游标
DECLARE cur_productid productinfo.productid%TYPE := '0240'; cur_productprice productinfo.productprice%TYPE := 1200; cur_prodrcd productinfo%ROWTYPE; CURSOR pdct_parameter_cur (id varchar,price NUMBER) IS SELECT * FROM productinfo WHERE productid like id||'%' AND productprice>price;BEGIN OPEN pdct_parameter_cur; LOOP FETCH pdct_parameter_cur INTO cur_prodrcd; EXIT WHEN pdct_parameter_cur%NOTFOUND; DBMS_OUTPUT.PUT_LINE('产品ID' || cur_prodrcd.productid); END LOOP; CLOSE pdct_parameter_cur;END;