游标
SQL> set serveroutput on
SQL> DECLARE
2 --定义游标,因为该游标中的数据需要更新,所以使用for update
3 CURSOR cur_test1 IS
4 SELECT *
5 FROM test1
6 FOR UPDATE;
7 --定义记录类型,使用锚定。这样表test1变化时,不需要修改程序
8 rec_test1 test1%ROWTYPE;
9 BEGIN
10 OPEN cur_test1;
11 LOOP
12 FETCH cur_test1 INTO rec_test1;
13 EXIT WHEN cur_test1%NOTFOUND;
14 --更新游标指针目前指向的test1的数据,使用current of cur_test1
15 UPDATE test1
16 SET a = a + 10
17 WHERE CURRENT OF cur_test1;
18 END LOOP;
19 CLOSE cur_test1;
20 COMMIT;
21
22 --我们使用隐式游标再打开一次,把结果显示出来看看
23 FOR rec_test1_2 IN ( SELECT * FROM test1 ) LOOP
24 dbms_output.put_line(rec_test1_2.a);
25 END LOOP;
26 END;
2 rowid
例如,创建表employee(first_name varchar2, last_name varchar2),并在employee.last_name上创建索引ind_e1。我们可以把索引ind_e1看做是另外一张表,它包含2列(last_name, rowid)。
我们发出的sql:update employee set first_name=‘h‘ where last_name=‘g‘;先从索引ind_e1上查询到该行的rowid,然后再根据rowid直接定位到该行数据所在的数据块和行。
那么很明显,我们直接使用rowid作为查询条件,会比使用索引有更高的执行效率,因为这样会跳过从索引中查询rowid的步骤。下面是一个图示: