一:游标
Oracle会创建一个上下文区域,用于处理SQL语句,其中包含需要处理的语句、处理结果等等。
游标指向这一上下文的区域。
PL/SQL通过控制游标在上下文区域移动,来获取SQL语句的结果信息。
有两种类型的游标:
-
隐式游标
-
显式游标
二:隐式游标
对于DML操作(INSERT、UPDATE、DELETE)语句,Oracle会自动创建隐式游标指向该语句的上下文区域。
对于隐式游标,我们无法通过游标名来显式操作它,但是可以通过一些通用的属性来获取到最近的隐式游标指向的上下文区域中的信息,主要有:
%FOUND 如果一个INSERT,UPDATE或DELETE语句影响了一行或多行或SELECT INTO语句返回一行或多行,返回TRUE;否则,它将返回FALSE。 %NOTFOUND 与%FOUND相反。如果一个INSERT,UPDATE或DELETE语句影响没有行或SELECT INTO语句返回任何行,返回TRUE。否则,它将返回FALSE。 %ISOPEN 隐式游标总是返回FALSE,因为Oracle执行其相关的SQL语句之后自动关闭SQL游标。 %ROWCOUNT 返回受INSERT,UPDATE,或DELETE语句,或SELECT INTO语句影响的行数。
属性访问格式:sql%属性名
例如:
DECLARE total_rows number(2); BEGIN UPDATE customers SET salary = salary + 500; IF sql%notfound THEN //获取执行结果 dbms_output.put_line('no customers selected'); ELSIF sql%found THEN total_rows := sql%rowcount; dbms_output.put_line( total_rows || ' customers selected '); END IF; END;
三:显式游标
显式游标 在DECLARE部分被定义,一般用于指向SELECT语句的执行结果。
1)创建游标
CURSOR cursor_name IS select_statement;
2)打开游标
打开游标分配内存,使得其接收所获取的sql语句的执行结果。
OPEN cursor_name;
3)获取当前游标所指向的行
获取一次,读取一行,并且读取完后自动移动到下一行。
FETCH cursor_name INTO 变量1, 变量2, 变量3...; //用变量依次获取当前行的各个字段值
4)关闭游标
关闭游标来释放分配的内存。
CLOSE cursor_name;
5)例子
DECLARE c_id customers.id%type; //声明用于接收游标各个字段值的变量,变量的类型用 表名.字段名%type 来获取对应字段的数据类型 c_name customers.name%type; c_addr customers.address%type; CURSOR c_customers is //声明游标 SELECT id, name, address FROM customers; BEGIN OPEN c_customers; //打开游标 LOOP FETCH c_customers into c_id, c_name, c_addr; //获取当前游标执行值 EXIT WHEN c_customers%notfound; //当游标指向末尾时,终止遍历 dbms_output.put_line(c_id || ' ' || c_name || ' ' || c_addr); END LOOP; CLOSE c_customers; END;