PLSQL操作

游标

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 

 

pl/sql的主要功能是处理表中的数据,效率的提高主要是在数据的查询上。我们已经知道索引可以提高查询效率。那么,索引的原理是什么呢?

例如,创建表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的步骤。下面是一个图示:
 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。