--课前测 declare type emp_record_type is record( ename emp.ename%type, empno emp.empno%type, dname dept.dname%type ); type emp_table_type is table of emp_record_type index by binary_integer; v_emp emp_table_type; begin select e.ename,e.empno,d.dname bulk collect into v_emp from emp e inner join dept d on e.deptno=d.deptno; for v_i in 1..v_emp.count loop dbms_output.put_line('员工号:'||v_emp(v_i).empno||'员工姓名:'||v_emp(v_i).ename||'部门号'||v_emp(v_i).dname); end loop; end; --游标 declare type emp_record_type is record( ename emp.ename%type, empno emp.empno%type, dname dept.dname%type ); type emp_table_type is table of emp_record_type index by binary_integer; v_emp emp_table_type; cursor c is select e.ename,e.empno,d.dname from emp e inner join dept d on e.deptno=d.deptno; begin for v_emp in c loop dbms_output.put_line('员工号:'||v_emp.empno||'员工姓名:'||v_emp.ename||'部门号'||v_emp.dname); end loop; end; --1,写函数和过程,输入三角形三个表的长度。在控制台打印三角形的面积。 --过程 create or replace procedure pro_area( v_a number,v_b number,v_c number ) is v_p number(10,2); v_area number(10,2); v_if number(10,2); begin v_p:=(v_a+v_b+v_c)/2; v_if:=v_p*((v_p-v_a)*(v_p-v_b)*(v_p-v_c)); if v_if>0 then v_area:=sqrt(v_if); dbms_output.put_line('三角形的面积是:'||v_area); else dbms_output.put_line('你输入的三角形不存在'); end if; end; declare v_a number(8,2):=&请输入第一条边; v_b number(8,2):=&请输入第二条边; v_c number(8,2):=&请输入第三条边; begin pro_area(v_a,v_b,v_c); end; --函数 create or replace function fun_area( v_a number,v_b number,v_c number) return varchar2 is v_sout varchar2(100); v_p number(10,2); v_area number(10,2); v_if number(10,2); begin v_p:=(v_a+v_b+v_c)/2; v_if:=v_p*((v_p-v_a)*(v_p-v_b)*(v_p-v_c)); if v_if>0 then v_area:=sqrt(v_if); v_sout:='三角形的面积是:'||v_area; else v_sout:='你输入的三角形不存在'; end if; return v_sout; end; declare v_sout varchar2(100); v_a number(8,2):=&请输入第一条边; v_b number(8,2):=&请输入第二条边; v_c number(8,2):=&请输入第三条边; begin v_sout:=fun_area(v_a,v_b,v_c); dbms_output.put_line(v_sout); end; --2,写一个过程,输入部门编号,在控制台打印这个部门的名称,总人数,平均工资(基本工资+奖金) create or replace procedure pro_dept_test1(v_deptno number) is v_dname dept.dname%type; v_total dept.deptno%type; v_avg emp.sal%type; begin select dname,count(e.empno),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; dbms_output.put_line('部门名称为'||v_dname||'部门总人数为'||v_total||'人,平均工资为'||v_avg||'元'); exception when no_data_found then dbms_output.put_line('您输入的部门编号不存在'); end; declare v_deptno dept.deptno%type:=&请输入部门编号; begin pro_dept_test1(v_deptno); end; --3,编写一个存储过程,输入一个员工编号,输出该员工的员工编号,员工姓名,部门名称。 create or replace procedure pro_emp_test1(v_empnoin number) is ename emp.ename%type; empno emp.empno%type; dname dept.dname%type; begin select e.ename,e.empno,d.dname into ename,empno,dname from emp e inner join dept d on e.deptno=d.deptno and e.empno=v_empnoin; dbms_output.put_line('员工号:'||empno||'员工姓名:'||ename||'部门号'||dname); end; declare v_empno emp.empno%type:=&请输入员工编号; begin -- 调用存储过程 pro_emp_test1(v_empno); exception when no_data_found then dbms_output.put_line('输入的员工编号不存在'); end; --4编写一个存储过程,输出所有员工及其部门领导的姓名、员工号及部门号。 create or replace procedure pro_emp_test2 is type emp_record_type is record( ename emp.ename%type, mname emp.ename%type, empno emp.empno%type, deptno emp.deptno%type ); type emp_table_type is table of emp_record_type index by binary_integer; 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).ename||',部门领导姓名:'||v_emp(v_i).mname ||',员工号:'||v_emp(v_i).empno||',部门编号:'||v_emp(v_i).deptno); end loop; end; call pro_emp_test2();