PLSQL学习之——游标

应用有个业务是跑一个全国的批量数据,但是存在执行时间过长的问题,因此考虑到分省执行的方法,即先将省号先存入游标里,然后省号通过变量的方式带入sql中where条件中执行。在这个过程中也就用到了游标,作为一个dba,虽然没有必要根据业务写plsql,但是必须是要能看懂plsql的,以下为根据业务的语句,进行的模拟测试,需要注意的是plsql中的cursor和sql对应的cursor还是有区别的,具体区别会另写文章说明:

*****************************
创建cursor,并将cursor中的值进行打印,此方法在测试cursor中有无传入值时非常有用。
*****************************
create table dayutest2(object_name varchar2(30),object_type varchar2(30),id number(30)); insert into dayutest2 values('a','TABLE',1); insert into dayutest2 values('b','INDEX',1); set serveroutput on declare cursor v_product_cursor is select object_type from dayutest2; begin for v_object_type in v_product_cursor loop DBMS_OUTPUT.PUT_LINE('object_type = ' || v_object_type.object_type); end loop; end; /

 

**************************
以下为具体的一个测试案例
**************************
create table dayutest2(object_name varchar2(30),object_type varchar2(30),id number(30)); insert into dayutest2 values('a','TABLE',1); insert into dayutest2 values('b','INDEX',1); drop table dayutes1; create table dayutest1 as select * from dba_objects where 1=2; create table test1 as select * from dba_objects; insert into test1 select * from test1; declare cursor v_product_cursor is select object_type from dayutest2; BEGIN FOR I IN v_product_cursor LOOP INSERT INTO dayutest1 d select /*+ parallel(t 4) */ * from test1 t where t.object_type=I.object_type; --这里需要特别注意一下 COMMIT; END LOOP; end; / --此过程创建的为块,并非为存储过程,运行直接会出结果。
  • 需要说明一下存储过程是创建完了之后需要调用,这个调用方法包括dbms包调用或者手动执行。但是创建的块可以理解为就是一个sql语句,执行完毕之后会立即出结果。
  • 在此次测试中,select部分的查询调用并行成功,但是dml部分即使在执行了ALTER SESSION ENABLE PARALLEL  DML也未成功,还需要进一步跟进一下。

 

posted @ 2018-09-27 18:57  dayu.liu  阅读(351)  评论(0编辑  收藏  举报