游标(Cursor)是一个指向上下文去的句柄(handle)或指针。
游标可分为显示游标&隐示游标两种。
2.显示游标
显示游标用来处理多于一行的SELECT语句。
2.2显示游标的处理包括4歌PL/SQL步骤,如下:
1)声明游标。
2)为查询打开游标。
3)将结果提取(fetch)到PL/SQL变量中。
4)关闭游标。
下面是一个关于显示游标处理的完整事例:
DECLARE
v_Pet_id occupancy.pet_id%TYPE;
/*声明游标*/
CURSOR occupancy_cur IS
SELECT pet_id, room_number
FROM occupancy WHERE pet_id = v_Pet_id;
occupancy_rec occupancy_cur%ROWTYPE;
BEGIN
v_Pet_id := 22;
/*为查询打开游标*/
OPEN occupancy_cur;
LOOP
/*将结果提取(fetch)到PL/SQL变量中*/
FETCH occupancy_cur INTO occupancy_rec;
/*如果前面FETCH没有返回一个行,那么occupancy_cur%NOTFOUND
就会返回一个True,从而跳出当前的循环*/
EXIT WHEN occupancy_cur%NOTFOUND;
update_bill
(occupancy_rec.pet_id, occupancy_rec.room_number);
END LOOP;
/*关闭游标*/
CLOSE occupancy_cur;
END;
另外,游标也可以这样声明:
DECLARE
/*声明游标*/
CURSOR occupancy_cur(p_Pet_id occupancy.pet_id%TYPE) IS
SELECT pet_id, room_number
FROM occupancy WHERE pet_id = v_Pet_id;
occupancy_rec occupancy_cur%ROWTYPE;
BEGIN
/*为查询打开游标*/
OPEN occupancy_cur(22);
LOOP
/*将结果提取(fetch)到PL/SQL变量中*/
FETCH occupancy_cur INTO occupancy_rec;
/*如果前面FETCH没有返回一个行,那么occupancy_cur%NOTFOUND
就会返回一个True,从而跳出当前的循环*/
EXIT WHEN occupancy_cur%NOTFOUND;
update_bill
(occupancy_rec.pet_id, occupancy_rec.room_number);
END LOOP;
/*关闭游标*/
CLOSE occupancy_cur;
END;
3.隐式游标
隐式游标用于处理INSERT、UPDATE、DELETE&单行的SELECT..INTO语句。
隐式游标是指向处理所有的SQL语句的环境区域的指针,隐式游标也叫SQL游标。与显式游标不同的是,SQL游标不能通过专门的命令打开火关闭。PL/SQL隐式地打开SQL游标,并在它内部处理SQL语句,然后关闭它。
下面具体介绍SQL游标的属性:
1)%FOUND
当使用Insert,Delete或Update语句处理一行或多行,或执行SELECT INTO语句返回一行时,%FOUND返回TRUE,否则返回FALSE。
注意,如果执行SELECT INTO语句时返回多行,则会产生TOO_MANY_ROWS异常,并将控制权转到异常处理部分,%FOUND属性并不返回TRUE。如果执行SELECT INTO语句时返回0行,会产生NO_DATA_FOUND异常,%FOUND属性并不返回FALSE。
