如果要参考基本的produre语法,可以访问官网:
http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/overview.htm#sthref232
具体代码示例如下:
-- Create table
create table COURSE
(
CNO INTEGER not null,
CNAME VARCHAR2(20),
TNO INTEGER
);
-- Add comments to the table
comment on table COURSE
is ' 课程关系表';
-- Create/Recreate primary, unique and foreign key constraints
alter table COURSE
add constraint PK_COURSE primary key (CNO)
using index ;;
-- Create table
create table TEACHER
(
TNO INTEGER not null,
TNAME VARCHAR2(20),
TITLE VARCHAR2(20)
);
-- Add comments to the table
comment on table TEACHER
is '教师表';
-- Create/Recreate primary, unique and foreign key constraints
alter table TEACHER
add constraint PK_TEACHER primary key (TNO)
using index ;
-- 插入数据
insert into TEACHER (TNO, TNAME, TITLE)
values (1, '张老师', '教授');
insert into TEACHER (TNO, TNAME, TITLE)
values (2, '王老师', '硕士');
insert into TEACHER (TNO, TNAME, TITLE)
values (3, '李老师', '本科');
insert into COURSE (CNO, CNAME, TNO)
values (1, '数学', 1);
insert into COURSE (CNO, CNAME, TNO)
values (2, '语文', 2);
insert into COURSE (CNO, CNAME, TNO)
values (3, '英语', 3);
insert into COURSE (CNO, CNAME, TNO)
values (4, '物理', 4);
创建存储过程;
create or replace procedure proc_nest_cursor as
cursor cur_course is select cno,cname,tno from course;
v_cno course.cno%type;
v_cname course.cname%type;
v_tno course.tno%type;
v_tname teacher.tname%type;
v_title teacher.title%type;
cursor cur_teacher(lv_tno teacher.tno%type) is select tname ,title from teacher where tno=lv_tno ;
begin
open cur_course ;
loop
fetch cur_course into
v_cno,v_cname,v_tno ;
exit when cur_course%notfound;-- 注意判断并要退出循环
dbms_output.put_line('外层循环开始:课程='||v_cno||' 课程名称='||v_cname||' 课程教师编号 ='|| v_tno );
dbms_output.put_line('内层循环开始');
--内层游标以外层游标的数据为基础,如果匹配外层游标,就进入内层游标进行处理,如果匹配不上外层游标,不进入内层游标(这个工作,由内层游标的exit when cur_vouchinfo%notfound)
--不需要再使用判断机制if else
open cur_teacher(v_tno) ; -- 注意参数的位置 在open 这边
loop
fetch cur_teacher into v_tname,v_title ;
exit when cur_teacher%notfound;-- 注意判断并要退出循环
dbms_output.put_line('内层循环 课程教师编号:'||v_tno ||' 教师名称='||v_tname ||' 教师职称='||v_title);
end loop;
dbms_output.put_line('内层循环结束');
close cur_teacher ;-- 记得关闭 游标
end loop;
dbms_output.put_line('外层循环结束');
close cur_course; -- 记得关闭 游标
end proc_nest_cursor;
-- 执行存储过程:
SQL> set serverout on size 20000;
SQL> exec proc_nest_cursor
外层循环开始:课程=1 课程名称=数学 课程教师编号 =1
内层循环开始
内层循环 课程教师编号:1 教师名称=张老师 教师职称=教授
内层循环结束
外层循环开始:课程=2 课程名称=语文 课程教师编号 =2
内层循环开始
内层循环 课程教师编号:2 教师名称=王老师 教师职称=硕士
内层循环结束
外层循环开始:课程=3 课程名称=英语 课程教师编号 =3
内层循环开始
内层循环 课程教师编号:3 教师名称=李老师 教师职称=本科
内层循环结束
外层循环开始:课程=4 课程名称=物理 课程教师编号 =4
内层循环开始
内层循环结束
外层循环结束
PL/SQL procedure successfully completed
SQL>
小结:
业务逻辑的处理流程一定要清晰理解,具体就是多个游标间的逻辑关系:是平行或是父子级别的关系;如果采用平行关系;会导致重复数据的多次打开,减慢效率。
游标的参数化一定要好好理解,具体就是游标的参数究竟要几个,以什么为准.这个要和业务理解关联起来.参数化可以让游标的结果是动态化的.游标参数相当于where条件,不同的where条件每次输入不同的值,显示结果当然不同了.不就动态了
www.itlife365.com
实战实战太重要,仅看是远远不够的.先模仿优秀的写法,然后变成自己的,当然这个过程要一些时间了.