pl/sql练习案例

Posted nnnnmmmm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pl/sql练习案例相关的知识,希望对你有一定的参考价值。

pl/sql练习案例

1,写匿名块,输入三角形三个边的长度。在控制台打印三角形的面积。

declare
--声明变量
v_w number(8,2):=&三角形的底边;
v_h number(8,2):=&三角形的高;
v_s number(8,2);
begin
--计算面积
v_s:=(v_w*v_h)/2;
--控制台输出
dbms_output.put_line(‘三角形的面积:‘||v_s);
end;

2,输入部门编号,在控制台打印这个部门的名称,总人数,平均工资(基本工资+奖金)

declare
--声明变量
v_empno number(8,2):=&员工编号;
v_count number(8,2);
v_avg number(8,2);
begin
case v_empno
when 10 then
  dbms_output.put_line(‘部门名称为:技术部‘);
when 20 then
  dbms_output.put_line(‘部门名称为:销售部‘);
when 30 then
  dbms_output.put_line(‘部门名称为:公关部‘);
when 40 then
  dbms_output.put_line(‘部门名称为:开发部‘);
else
  dbms_output.put_line(‘输入错误‘);
end case;
?
select count(*) into v_count from emp e where deptno=v_empno;
dbms_output.put_line(‘总人数为:‘||v_count);
 
select avg(sal+nvl(comm,0)) into v_avg from emp
where deptno=v_empno;
dbms_output.put_line(‘平均工资为:‘||v_avg);
?
end;

3,编写一个PL/SQL块,输出所有员工的员工姓名、员工号、工资和部门号

这里用loop循环

declare
type emp_table_type is table of emp%rowtype
index by binary_integer;
v_emp emp_table_type;
v_i number(8):=1;
begin
--这里用到了bulk collect into (批量效率的读取游标数据)
select * bulk collect into v_emp from emp ;
loop
  if v_i>v_emp.count then
    exit;
  end if;  
  dbms_output.put_line(
  ‘员工编号:‘||v_emp(v_i).empno
  ||‘员工姓名:‘||v_emp(v_i).ename
  ||‘工资:‘||v_emp(v_i).sal
  ||‘部门编号:‘||v_emp(v_i).deptno
  );
  v_i:=v_i+1;
end loop;
?
end;

4,编写一个PL/SQL块,输出所有比本部门平均工资高的员工信息。

这里用for 循环

declare
type emp_table_type is table of emp%rowtype
index by binary_integer;
v_emp emp_table_type;
begin
select * bulk collect into v_emp from emp where sal>(
select avg(sal) from emp where deptno=&no)and
deptno=&no;
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).job ||
    ‘领导编号‘||v_emp(v_i).mgr ||
    ‘入职日期‘|| v_emp(v_i).hiredate ||
    ‘工资‘||v_emp(v_i).sal ||
    ‘奖金‘|| v_emp(v_i).comm ||
    ‘职位编号‘||v_emp(v_i).deptno);
  end loop;
?
end;

5,编写一个PL/SQL块,输出所有员工及其部门领导的姓名、员工号及部门号。

这里用while循环

declare
type emp_table_type is table of emp%rowtype
index by binary_integer;
v_emp emp_table_type;
v_i number(8):=1;
begin
select * bulk collect into v_emp from emp;
while v_i<v_emp.count
  loop
    dbms_output.put_line(
    ‘员工编号‘||v_emp(v_i).empno||
    ‘员工姓名‘||v_emp(v_i).ename||
    ‘领导姓名‘||v_emp(v_i).job||
    ‘部门编号‘||v_emp(v_i).deptno);
    v_i:=v_i+1;
  end loop;
end;

7,输入员工编号,根据员工的入职时间修改发放奖金类,大于等于6年的奖金为2000,小于6年的奖金是1500

declare
v_comm emp.comm%type;
v_yyyy number(8);
v_empno emp.empno%type:=&员工编号;
begin
--三个查询,先查询出当前日期和员工入职日期,然后计算出两者的相差
--months_between 计算两个时间段相差的月份
select months_between(
(select sysdate from dual),
(select hiredate from emp where empno=v_empno))
into v_yyyy from dual;
--查询出工资员工
select comm into v_comm from emp where empno=v_empno;
--将计算后的时间换算为年
v_yyyy:=v_yyyy/12;
--判断
if v_yyyy>=6 then
  if v_comm is null then
    update emp set comm=(2000) where empno=v_empno;
  else
    update emp set comm=(v_comm+2000) where empno=v_empno;
  end if;
  dbms_output.put_line(‘发放奖金2000元‘);
elsif v_yyyy<6 then
  if v_comm is null then
      update emp set comm=(1500) where empno=v_empno;
    else
      update emp set comm=(v_comm+1500) where empno=v_empno;
  end if;
  dbms_output.put_line(‘发放奖金1500元‘);
else
  dbms_output.put_line(‘输入错误‘);
end if;
end;

8,分别用loop ,while,for循环在控制台输出1到100的自然数。

loop循环

declare
v_i number(8):=1;
v_m varchar2(1000):=‘‘;
begin
loop
  if v_i>100 then
    exit;
  end if;
  v_m:=v_m||v_i||‘ ‘;
  v_i:=v_i+1;
end loop;
dbms_output.put_line(v_m);
?
end;

while 循环

declare
v_i number(8):=1;
v_m varchar2(1000):=‘‘;
begin
while v_i<=100
  loop
      v_m:=v_m||v_i||‘ ‘;
  v_i:=v_i+1;
  end loop;
dbms_output.put_line(v_m);
?
end;

for 循环

declare

v_m varchar2(1000):=‘‘;
begin
  for v_i in 1..100
    loop
      v_m:=v_m||v_i||‘  ‘;
    end loop;
    dbms_output.put_line(v_m);
end;

9,在控制台输出1到100以内的素数。

declare
v_i number(8);
v_j number(8):=1;
v_n number(8):=0;
begin
  for v_i in 1..100
    loop
      while v_j<=v_i
        loop
          if mod(v_i,v_j)=0 then
            v_n:=v_n+1;
          end if;
          v_j:=v_j+1;
        end loop;
        v_j:=0;
        if v_n=2 then
          dbms_output.put_line(v_i);
        end if;
        v_n:=0;
    end loop;
end;

以上是关于pl/sql练习案例的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 上机练习

PL/SQL练习基本的PL/SQL语句

pl/sql基础练习

pl/sql练习

PL/SQL 触发器练习

PL/SQL练习函数