实验有一个重点,就是如何让一个数据查询持续很长时间,由于环境的限制,笔者不能拿到一个长时间操作的数据范围。所以,采用了一些变通方法。
set time on;
set serveroutput on;
declare
coun number;
cursor tes is select * from t;
t_info t%rowtype;
begin
coun := -1;
open tes;
loop
fetch tes into t_info;
coun := coun + 1;
dbms_lock.sleep(0.1);
exit when tes%notfound;
end loop;
dbms_output.put_line('Total Count: '||to_char(coun));
end;
/
代码中的部分就是使用游标逐条的fetch数据表t记录。关键部分在于dbms_lock方法sleep,它可以实现让代码终止一段时间,模拟长时间操作处理。这样,我们就可以在另一个会话中更从容的进行操作了
或者用另外一种方法:
SQL> var x refcursor //定义一个游标变量x
SQL>exec open: x for select * from t1 where id =1;//为select语句分配并打开游标X。
这个是关键的一步,select语句此时
执行而获得结果(结果保存在游标指向的内存上)
后不会马上退出,而是暂停在那里。
SQL>update t1 set name='TTTT' where id=1;
SQL>commit;
SQL>update t1 set name='YYYY' where id=1;
SQL>commit;
SQL>print:x //打印出执行语句exec open: x for select * from t1 where id =1;后所得的结果
ID NAME
------ ---------
1 AAAA //(原值)
SQL>select * from t1 where id =1;
ID NAME
------ ---------
1 YYYY