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也未成功,还需要进一步跟进一下。