存储过程(带名块)
1)创建带in参数的存储过程pro_emp1,要求根据用户输入的员工号,返回员工的姓名、入职日期和佣金并输出,编写匿名块调用此过程。(使用emp表为数据源,后续根据情况自己判断)
create or replace procedure pro_emp1(ep number)
as
en emp.ename%type;
eh emp.hiredate%type;
ec emp.comm%type;
begin
select ename,hiredate,nvl(comm,0) into en,eh,ecfrom emp where empno=ep;
dbms_output.put_line('姓名:'||en||' 入职日期:'||eh||' 佣金:'||ec);
end;
declare
eno number;
begin
eno:=&n;
pro_emp1(eno);
end;
2)创建带in参数的存储过程pro_emp2访问emp表,根据输入的员工号,求该员工所在的部门名称和部门位置并输出,编写匿名块调用该存储过程。
create or replace procedure pro_emp2(ep number)
as
dn dept.dname%type;
dl dept.loc%type;
begin
select d.dname,d.loc into dn,dl from emp e,dept dwhere empno=ep and e.deptno=d.deptno;
dbms_output.put_line('部门名称:'||dn||'部门位置:'||dl);
end;
declare
eno number;
begin
eno:=&n;
pro_emp2(eno);
end;
3)创建带out参数的存储过程pro_emp3访问emp表,根据输入的员工工种,求出从事该工作的员工人数并输出,编写匿名块调用此过程。
create or replace procedure pro_emp3(ejemp.job%type,ec out number)
as
begin
select count(*) into ec from emp wherejob=upper(ej);
dbms_output.put_line(upper(ej)||'人数:'||ec);
end;
declare
jobs emp.job%type;
jsum number;
begin
jobs:='&n';
pro_emp3(jobs,jsum);
end;
4)创建带out参数的存储过程pro_emp4,要求根据输入的部门号,计算该部门的平均工资 并输出,编写匿名块调用此过程。
create or replace procedurepro_emp4(dp emp.deptno%type,avge out number)
as
begin
select avg(sal) into avgefrom emp where deptno=dp;
dbms_output.put_line('部门号:'||dp||'平均工资:'||avge);
end;
declare
dno number;
avgsal number;
begin
dno:='&n';
pro_emp4(dno,avgsal);
end;
5)创建带in out参数模式的过程,给定两个数为参数,实现两个数进行交换。
create or replace procedurejh(a in out number,b in out number)
as
tp number;
begin
tp:=a;
a:=b;
b:=tp;
dbms_output.put_line('a:'||a||'b:'||b);
end;
declare
a number;
b number;
begin
a:=&a;
b:=&b;
dbms_output.put_line('a:'||a||'b:'||b);
jh(a,b);
end;
6)编写一个过程,使10号部门员工薪水上涨10%,20号部门员工薪水上涨20%,其它部门员工薪水保持不变。( 注意使用commit)
create or replace procedure upsal
as
begin
update emp set sal=sal*1.1 where deptno=10;
dbms_output.put_line('10号部门员工薪水上涨10%');
update emp set sal=sal*1.2 where deptno=20;
dbms_output.put_line('20号部门员工薪水上涨20%');
dbms_output.put_line('其它部门员工薪水保持不变');
commit;
end;
begin
upsal;
end;
7)创建一个函数,以员工号为参数,输出其部门内工资最高的员工姓名。
create or replace function dmax(eno number)
return varchar2
is
maxname varchar2(100);
cursor dsmax
is
select * from emp where sal>=(
select max(sal) from emp group by deptno having deptno=(
select deptno from emp where empno=7369))
and deptno=(select deptno from emp where empno=7369);
--and rownum=1;
begin
maxname:=eno||'所在部门中,拥有着最高工资的有';
for maxs in dsmax loop
maxname:=maxname||maxs.ename||' ';
end loop;
return maxname;
end;
select dmax(7788) from dual;
7.2)创建一个过程,以员工号为参数,输出其部门内工资最高的员工姓名。
create or replace procedure dmaxa(eno number)
is
cursor dsmax
is
select * from emp where sal>=(
select max(sal) from emp group by deptno having deptno=(
select deptno from emp where empno=eno))
and deptno=(select deptno from emp where empno=eno);
begin
for maxs in dsmax loop
dbms_output.put_line(maxs.ename);
end loop;
end;
begin
dmaxa(7788);
end;
8)创建一函数,函数有两个数字类型参数,实现功能为返回该数的n次幂,调用该函数。
create or replace function mi1(x number,n number)
return number
is
px number;
begin
select power(x,n) into px from dual;
return px;
end;
declare
p number;
begin
p:=mi1(2,4);
dbms_output.put_line(p);
end;
9)创建带一参数的函数,员工号为参数,计算该员工所属部门的平均工资,并调用此函数。
createor replace function avgsals(eno number)
returnnumber
is
avgsumnumber;
begin
selectavg(sal) into avgsum from emp
wheredeptno=(select deptno from emp where empno=eno);
returnavgsum;
end;
selectavgsals(7521) from dual;
10) 创建一带两个参数的函数:函数返回截取的字符串长度,第一个参数为输入的字符串,第二个参数为要截取字符串的长度,函数返回被截取的子字符串,调用该函数。
create orreplace function jq(sr varchar2,jq1 number)
returnvarchar2
is
jgvarchar2(10);
begin
selectsubstr(sr,1,jq1) into jg from dual;
return jg;
end;
select jq('123456',3)from dual;
11) 创建带in参数的存储过程带3个参数,实现向部门表dept插入数据,判断如果插入数据成功则提交,否则回滚。
create orreplace procedure din3(dn dept.dname%type,dp dept.deptno%type,dl dept.loc%type)
as
begin
insert intodept(dname,deptno,loc)values(dn,dp,dl);
ifsql%found=true then
commit;
dbms_output.put_line('成功');
else
rollback;
dbms_output.put_line('失败');
end if;
exception
when OTHERSthen
rollback;
dbms_output.put_line('失败');
end;
begin
din3('dasdsa',80,'adasd');
end;
12)创建一个函数以圆半径为参数,实现计算圆的面积。
create orreplace function ymj(r number)
return number
is
mj number;
begin
mj:=acos(-1)*r*r;
return mj;
end;
select ymj(10)from dual;
13)创建存储过程,根据员工编号输出该员工所在的部门名称、所在部门的平均工资;
create or replace procedure d_avg(eno number)
as
dno number;
savg number;
begin
select deptno,avg(sal) into dno,savg from emp wheredeptno=(select deptno from emp where empno=eno) group by deptno;
dbms_output.put_line(dno||'部门的平均工资为'||savg);
end;
begin
d_avg(7369);
end;
14) 创建一个函数,根据员工编号返回该员工的工作年限。
create or replace function getyear(eno number)
return number
is
wy number;
begin
select round(months_between(sysdate,hiredate)) into wy
from emp where empno=eno;
return wy;
end;
select getyear(7369) from emp where empno=7369;