1,写函数和过程,输入三角形三个表的长度。在控制台打印三角形的面积
-- 创建包 create or replace package pac_area is -- 定义计算三角形面积的过程 procedure pro_area (v_side_first number,v_side_second number,v_side_third number); -- 定义获取三角形面积的函数 function fun_area return number; end; -- 创建包体 create or replace package body pac_area is -- 把三角形面积定义成包体的成员变量 v_area number(10,2); -- 调用包中的过程 procedure pro_area (v_side_first number,v_side_second number,v_side_third number) is v_p number(10,2); begin v_p:=(v_side_first+v_side_second+v_side_third)/2; v_area:=sqrt(v_p*(v_p-v_side_first)*(v_p-v_side_second)*(v_p-v_side_third)); dbms_output.put_line('三角形的面积为:'||v_area); end; --调用包中的函数 function fun_area return number is begin return v_area; end; end; -- 通过匿名块调用包中的过程和函数 declare -- 声明变量 调用函数时使用 v_area number(10,2); begin -- 调用包中的过程 pac_area.pro_area (3,v_side_third=>5,v_side_second=>4); -- 调用包中的函数 v_area:=pac_area.fun_area (); dbms_output.put_line('调用函数面积:'||v_area); end;
2,写一个过程,输入部门编号,在控制台打印这个部门的名称,总人数,平均工资(基本工资+奖金)
-- 创建存储过程 输入部门编号,在控制台打印这个部门的名称,总人数,平均工资(基本工资+奖金) create or replace procedure pro_dept (v_deptno number,v_dname out varchar2,v_total out number,v_avg out number) is begin select d.dname,count(e.ename),avg(sal+nvl(comm,0)) into v_dname,v_total,v_avg from emp e inner join dept d on e.deptno=d.deptno where e.deptno=v_deptno group by d.dname; end; -- 通过匿名块调用存储过程 declare -- 声明变量 接收出参 v_dname dept.dname%type; v_total number(30); v_avg number(30,2); begin --调用过程 pro_dept (10,v_dname,v_total,v_avg); dbms_output.put_line('部门名称:'||v_dname||',总人数:'||v_total||',平均工资:'||v_avg); end;
3,编写一个存储过程,输入一个员工编号,输出该员工的员工编号,员工姓名,部门名称
-- 创建存储过程 create or replace procedure pro_emp (v_empno number,v_empno1 out number,v_ename out varchar2,v_dname out varchar2) is begin select e.empno,e.ename,d.dname into v_empno1,v_ename,v_dname from emp e inner join dept d on e.deptno=d.deptno where e.empno=v_empno; end; -- 通过匿名块调用存储过程 declare -- 声明变量,接收出参 v_empno1 emp.empno%type; v_ename emp.ename%type; v_dname dept.dname%type; begin -- 调用过程 pro_emp (7499,v_empno1,v_ename,v_dname); dbms_output.put_line('员工编号:'||v_empno1||',员工姓名:'||v_ename||',部门名称:'||v_dname); end;
4,编写一个存储过程,输出所有员工及其部门领导的姓名、员工号及部门号
-- 创建存储过程 create or replace procedure pro_emp1 is -- 声明record类型 type emp_record_type is record( -- 声明record类型中的变量 v_ename emp.ename%type, v_mname emp.ename%type, v_empno emp.empno%type, v_deptno emp.deptno%type ); -- 声明table类型 type emp_table_type is table of emp_record_type -- 指定下标的增长方式为整数 没次增长1 index by binary_integer; -- 声明table类型的变量 v_emp emp_table_type; begin -- 查询所有要打印的数据 select ename,nvl((select e2.ename from emp e2 where e1.mgr=e2.empno),'无'),empno,deptno bulk collect into v_emp from emp e1; --循环 控制台打印输出结果 for v_i in 1..v_emp.count loop dbms_output.put_line('员工姓名:'||v_emp(v_i).v_ename||'领导姓名:'||v_emp(v_i).v_mname||'员工编号:'||v_emp(v_i).v_empno||'部门编号:'||v_emp(v_i).v_deptno); end loop; end; -- 通过call调用存储过程 call pro_emp1();