实验三 存储过程和函数

  1. 创建一个函数,以员工号为参数,返回该员工的工资。
create or replace function f_num_sal(vempno in emp.empno%type) return number
as
vsal number;
begin
select sal into vsal from emp where empno=vempno;
return vsal;
end;
/
  1. 创建一个存储过程,以部门号为参数,查询该部门的平均工资,并输出该部门中比平均工资高的员工号、员工名。
create or replace procedure f_deptno_avgdeptsal(vdeptno in emp.deptno%type)
as
vsal number;
begin
select avg(sal)  into vsal from emp where deptno=vdeptno;
dbms_output.put_line('平均工资'||vsal);
dbms_output.put_line('比平均工资高的员工号、员工名');
for v_emp in (select * from emp where deptno=vdeptno and sal>vsal)
loop
dbms_output.put_line(v_emp.empno||'、'||v_emp.ename);
end loop;
end;
  1. 创建一个存储过程,以部门号为参数,返回该部门的人数和最高工资。
create or replace procedure p_deptno_numandmaxsal(pdeptno emp.deptno%type)
is
max_sal emp.sal%type;
a number;
begin
select  count(*) into a from emp where deptno=pdeptno;
dbms_output.put_line('部门人数='||a);
select max(sal) into max_sal from emp where deptno=pdeptno;
dbms_output.put_line('最高工资='||max_sal);
end;
  1. 创建一个以部门号为参数,返回该部门最高工资的函数。
create or replace function f_deptno_maxsal(vdeptno in emp.deptno%type) return number
as
max_sal number;
begin
select sal into max_sal from emp where empno=vdeptno;
return max_sal;
end;
  1. 使用存储过程统计每个学生的‘已修学分’。
create table stu(
sname char(10) not null,
sno char(10) not null,
tcredit number);

create table sc
(sno char(10) not null,
cno char(10) not null,
grade number,
credit number,
primary key (sno,cno));

create table course
(cno char(10) not null,
cname char(20) not null);
insert into sc values('100001','200001',69,5);
insert into sc values('100001','200002','50','4');
insert into course values('200002','数据库系统设计');

create or replace procedure p_student_credit(
p_name out stu.sname%type,
p_credit out number)
as
begin
for p in (
select a.sname,sum(b.credit) credit
from stu a,sc b
where a.sno=b.sno)
loop
dbms_output.put_line(p.sname||'、'||p.credit);
end loop;
end;
  1. 使用触发器实现当登记学生成绩(60分以上)时自动统计学生的‘已修学分’。
create or replace trigger t_insert_credit
after insert on sc
for each row
begin
if :new.grade>=60 then
update stu 
set stu.tcredit=stu.tcredit+ :new.credit where stu.sno= :new.sno;
end if;
end;
  1. 使用函数实现统计各课程的未及格人数,要求输入参数课程号后,返回各课程的人数NUM。并实现调用,查‘数据库系统设计’的未及格人数。
create or replace function f_cno_num(f_cno sc.cno%type) return number
as
num number;
name char(20);
begin
select cname into name from course where  cno=f_cno;
select count(*) into num from sc where grade<60 and cno=f_cno;
 dbms_output.put_line(name||'未及格人数'||num);
return num;
end;
select f_cno_num(200002) 不及格人数 from dual;
  1. 将上实验中的存储过程与本实验中函数创建包。
create or replace package emp_package
is
function f_num_sal(vempno in emp.empno%type) return number;
procedure f_deptno_avgdeptsal(vdeptno in emp.deptno%type);
procedure p_deptno_numandmaxsal(pdeptno emp.deptno%type);
function f_deptno_maxsal(vdeptno in emp.deptno%type)  return number;
end emp_package;
  • 22
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的 MySQL 存储过程和存储函数实验。 首先,创建一个测试表 test_table,包含两个字段 id 和 name: ```sql CREATE TABLE test_table ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(50) NOT NULL, PRIMARY KEY (id) ); ``` 接着,我们创建一个存储过程,用于向 test_table 中插入数据: ```sql DELIMITER // CREATE PROCEDURE insert_data() BEGIN DECLARE i INT DEFAULT 1; WHILE (i <= 10) DO INSERT INTO test_table (name) VALUES (CONCAT('Name ', i)); SET i = i + 1; END WHILE; END // DELIMITER ; ``` 该存储过程名为 insert_data,它使用了一个 WHILE 循环来向 test_table 中插入 10 条数据,每个数据的 name 字段都是 'Name ' 加上当前循环次数 i。 接下来,我们创建一个存储函数,用于统计 test_table 中数据的数量: ```sql DELIMITER // CREATE FUNCTION count_data() RETURNS INT BEGIN DECLARE count INT; SELECT COUNT(*) INTO count FROM test_table; RETURN count; END // DELIMITER ; ``` 该存储函数名为 count_data,它使用了一个 SELECT COUNT(*) 查询来统计 test_table 中数据的数量,并将结果赋值给 count 变量,最终返回 count。 现在,我们可以分别调用 insert_data 存储过程和 count_data 存储函数来测试它们的效果: ```sql CALL insert_data(); SELECT count_data(); ``` 执行后,我们可以看到 test_table 中已经插入了 10 条数据,同时 count_data 函数返回的结果也是 10。 这就是一个简单的 MySQL 存储过程和存储函数实验。当然,实际使用中还有很多更复杂的情况需要考虑和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值