1.语法
CURSOR cursor_name
[(parameter_name datatype,...)]
IS select_statement; --游标关联的SELECT语句,该语句不能使用SELECT...INTO...语句
使用步骤
1.声明游标
DECLARE CURSOR cursor_name
IS 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;