码迷,mamicode.com
首页 > 其他好文 > 详细

存储子程序的设计

时间:2016-05-11 13:17:13      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:

---学生表
CREATE TABLE Student(
SNO VARCHAR2(7) PRIMARY KEY,
Sname VARCHAR2(18),
SSex CHAR(3),
Sage SMALLINT,
Sdept VARCHAR2(50),
SAvgGrade NUMBER(3,0),
SPicture BLOB
);
select * from Student;
---课程表
CREATE TABLE Course(
Cno VARCHAR2(4) PRIMARY KEY,
Cname VARCHAR2(50),
Cpno VARCHAR2(4),--前导课
Ccredit NUMBER(2,0),
FOREIGN KEY (Cpno) REFERENCES Course(Cno)
);

---选课表
CREATE TABLE SC(
Sno VARCHAR2(7),
Cno VARCHAR2(4),
Grade NUMBER(3,0),
PRIMARY KEY(Sno,Cno),
FOREIGN KEY (Sno) REFERENCES Student(Sno),
FOREIGN KEY (Cno) REFERENCES Course(Cno)
);

测试数据:
insert into student(sno,sname,ssex,sage,sdept) values(‘9512101‘,‘李勇‘,‘男‘,19,‘计算机系‘);
insert into student(sno,sname,ssex,sage,sdept) values(‘9512102‘,‘刘晨‘,‘男‘,20,‘计算机系‘);
insert into student(sno,sname,ssex,sage,sdept) values(‘9521101‘,‘张立‘,‘男‘,22,‘信息系‘);
insert into student(sno,sname,ssex,sage,sdept) values(‘9521102‘,‘吴宾‘,‘女‘,21,‘信息系‘);
insert into student(sno,sname,ssex,sage,sdept) values(‘9531101‘,‘钱小平‘,‘女‘,18,‘数学系‘);
insert into student(sno,sname,ssex,sage,sdept) values(‘9531102‘,‘王大力‘,‘男‘,19,‘数学系‘);

insert into course values(‘1‘,‘数据处理‘,null,2);
insert into course values(‘2‘,‘数学‘,null,2);
insert into course values(‘3‘,‘操作系统‘,‘1‘,3);
insert into course values(‘4‘,‘C语言程序设计‘,‘1‘,4);
insert into course values(‘5‘,‘数据结构‘,‘4‘,4);
insert into course values(‘6‘,‘数据库‘,‘5‘,4);
insert into course values(‘7‘,‘信息系统‘,‘6‘,4);

insert into sc values(‘9512101‘,‘1‘,92);
insert into sc values(‘9512101‘,‘2‘,85);
insert into sc values(‘9512101‘,‘3‘,88);
insert into sc values(‘9512102‘,‘2‘,90);
insert into sc values(‘9512102‘,‘3‘,100);

select * from Student;
select * from course;
select * from sc;

--2.1
create or replace procedure select_avg_proc
(p_sno in student.sno%type ,
p_avg out student.savggrade%type)
as
begin
select avg(grade) into p_avg from sc where sc.sno=p_sno;
end;
--测试一 指定参数--
declare
v_sno student.sno%type :=‘9512101‘;
v_avg student.savggrade%type;
begin
select_avg_proc(v_sno,v_avg) ;
dbms_output.put_line(‘学号为‘||v_sno||‘的学生的平均成绩为‘||nvl(v_avg,0));
end;

--测试二 输入参数--
declare
v_avg student.savggrade%type;
begin
select_avg_proc(&v_sno,v_avg);
dbms_output.put_line(‘学号为‘||&v_sno||‘的学生的平均成绩为‘||nvl(v_avg,0));
end;





--2.2
create or replace function select_avg_fun(p_sno student.sno%type)
return number
as
v_avg student.savggrade%type;
begin
select avg(grade) into v_avg from sc where sc.sno=p_sno;
return v_avg;
end;
--测试一 指定参数--
declare
v_sno student.sno%type :=‘9512101‘;
v_avg student.savggrade%type;
begin
v_avg :=select_avg_fun(v_sno);
dbms_output.put_line(‘学号为‘||v_sno||‘的学生的平均成绩为‘||nvl(v_avg,0));
end;
--测试二 输入参数--
declare
v_avg student.savggrade%type;
begin
select_avg_proc(&v_sno,v_avg);
v_avg :=select_avg_fun(&v_sno);
dbms_output.put_line(‘学号为‘||&v_sno||‘的学生的平均成绩为‘||nvl(v_avg,0));
end;

 


--2.3
create or replace procedure get_info_proc
(p_sno in student.sno%type,
p_avg out student.savggrade%type,
sc_cursor out sys_refcursor
)
as
begin
select avg(grade) into p_avg from sc where sc.sno=p_sno;
open sc_cursor for select course.cname, sc.grade from course,sc where sno=p_sno;
end;

--测试一
declare
v_avg student.savggrade%type;
sc_cursor sys_refcursor;
v_cname course.cname%type;
v_grade sc.grade%type;
begin
get_info_proc(&p_sno,v_avg,sc_cursor);
dbms_output.put_line(‘学号为‘||&p_sno||‘的学生的平均成绩为‘||nvl(v_avg,0));
dbms_output.put_line(‘--------------------------------------------------‘);
loop
fetch sc_cursor into v_cname,v_grade;
exit when sc_cursor%notfound;
dbms_output.put_line(‘课程名‘||rpad(v_cname,20,‘ ‘)||‘课程成绩为‘||nvl(v_avg,0));
end loop;
end;

--定义包规范
create or replace package student_pkg
as
type mycursor is ref cursor;
procedure select_all(outcursor out mycursor);
procedure selecte_all_by_sno(p_sno in varchar2,outcursor out mycursor);
procedure delete_all_by_sno(p_sno in varchar2) ;
end student_pkg;


--定义包体
create or replace package body student_pkg
as
procedure select_all(outcursor out mycursor)
as
begin
open outcursor for select * from student;
end select_all;

procedure selecte_all_by_sno(p_sno in varchar2,outcursor out mycursor)
as
begin
open outcursor for ‘select * from student where sno=:sno‘vc
--使用变量p_sno替换:sno
using p_sno;
end selecte_all_by_sno;

procedure delete_all_by_sno(p_sno in varchar2)
as
begin
delete from student where sno=p_sno;
end delete_all_by_sno;
end student_pkg;



declare
v_outcursor sys_refcursor;
v_student_row student%rowtype;
v_sno student.sno%type :=‘9512101‘;
begin
student_pkg.selecte_all_by_sno(v_sno,v_outcursor);
loop
fetch v_outcursor into v_student_row;
exit when v_outcursor%notfound;
dbms_output.put_line(v_student_row.sno||‘ ‘||v_student_row.Sname);
end loop;
end;




存储子程序的设计

标签:

原文地址:http://www.cnblogs.com/hbuser/p/5481333.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!