人生三大境界
衣带渐宽终不悔,为伊消得人憔悴。
昨夜西风凋碧树,独上高楼,望尽天涯路。
众里寻他千百度,蓦然回首,那人却在灯火阑珊处。

Oracle入门基础(十一)一一PL/SQL基本语法

1.打印Hello World

declare
  --说明部分
begin
  --程序
  dbms_output.put_line('Hello World');
end;

2.引用型变量

查询并打印7839的姓名和薪水

declare
  --定义变量保存姓名和薪水
  --pename varchar2(20);
  --psal   number;
  
  pename emp.ename%type;
  psal   emp.sal%type;
begin
  --得到7839的姓名和薪水
  select ename,sal into pename,psal from emp where empno=7839;
  --打印
  dbms_output.put_line(pename||'的薪水是'||psal);
end;

3.记录型变量

查询并打印7839的姓名和薪水

declare
  --定义记录型变量:代表一行
  emp_rec emp%rowtype;
begin
  select * into emp_rec from emp where empno=7839;
  
  dbms_output.put_line(emp_rec.ename||'的薪水是'||emp_rec.sal);
end;

4.if语句

-- 判断用户从键盘输入的数字
--接受键盘输入
--变量num:是一个地址值,在该地址上保存了输入的值
accept num prompt '请输入一个数字';

declare 
  --定义变量保存输入 的数字
  pnum number := #
begin
  if pnum = 0 then dbms_output.put_line('您输入的是0');
     elsif pnum = 1 then dbms_output.put_line('您输入的是1');
     elsif pnum = 2 then dbms_output.put_line('您输入的是2');
     else dbms_output.put_line('其他数字');
  end if;
end;

5.循环

– 打印1~10

declare 
  -- 定义变量
  pnum number := 1;
begin
  loop
    --退休条件
    exit when pnum > 10;
    dbms_output.put_line(pnum);
    --加一
    pnum := pnum + 1;
  end loop;
end;

6.带参数的光标

查询某个部门的员工姓名

   declare 
   --形参
   cursor cemp(dno number) is select ename from emp where deptno=dno;
   pename emp.ename%type;
begin
   --实参
   open cemp(20);
   loop
        fetch cemp into pename;
        exit when cemp%notfound;
        dbms_output.put_line(pename);
   end loop;
   close cemp;
end;

练习题–给员工涨工资
– 给员工涨工资,总裁1000 经理800 其他400

  declare 
  --定义光标
  cursor cemp is select empno,job from emp;
  pempno emp.empno%type;
  pjob   emp.job%type;
begin
  rollback;  
  --打开光标
  open cemp;  
  loop
       --取一个员工
       fetch cemp into pempno,pjob;
       exit when cemp%notfound;     
       --判断职位
       if pjob = 'PRESIDENT' then update emp set sal=sal+1000 where empno=pempno;
          elsif pjob = 'MANAGER' then update emp set sal=sal+800 where empno=pempno;
          else update emp set sal=sal+400 where empno=pempno;
       end if;

  end loop;
  --关闭光标
  close cemp;
  
  --提交  ----> why?: 事务 ACID
  commit;
  
  dbms_output.put_line('完成');
end;

7.系统例外

 被0除
declare
   pnum number;
begin
  pnum := 1/0;
exception
  when zero_divide then dbms_output.put_line('1:0不能做分母');
                        dbms_output.put_line('2:0不能做分母');
  when value_error then dbms_output.put_line('算术或者转换错误');                      
  when others then dbms_output.put_line('其他例外');
end;

8.其他例外

查询50号部门的员工
declare
cursor cemp is select ename from emp where deptno=50;
pename emp.ename%type;

  --自定义例外
  no_emp_found exception;
begin
  open cemp;
  
  --取第一条记录
  fetch cemp into pename;
  if cemp%notfound then
    --抛出例外
    raise no_emp_found;
  end if;
  
  --进程:pmon进程(proccesss monitor)
  close cemp;

exception
  when no_emp_found then dbms_output.put_line('没有找到员工');
  when others then dbms_output.put_line('其他例外');
end;

实例书写1
/*
1、SQL语句
select to_char(hiredate,‘yyyy’) from emp;
—> 集合 —> 光标 —> 循环—> 退出: notfound

2、变量:()初始值 ()最终如何得到
每年入职的人数
count80 number := 0;
count81 number := 0;
count82 number := 0;
count87 number := 0;
*/

 	declare 
   --定义光标
   cursor cemp is select to_char(hiredate,'yyyy') from emp;
   phiredate varchar2(4);
   --每年入职的人数
  count80 number := 0;
  count81 number := 0;
  count82 number := 0;
  count87 number := 0;
begin
  --打开光标
  open cemp;
  loop
    --取一个员工的入职年份
    fetch cemp into phiredate;
    exit when cemp%notfound;
    --判断年份是哪一年
    if phiredate = '1980' then count80:=count80+1;
       elsif phiredate = '1981' then count81:=count81+1;
       elsif phiredate = '1982' then count82:=count82+1;
       else count87:=count87+1;
     end if;
  end loop;
  
  --关闭光标
  close cemp;
  
  --输出
  dbms_output.put_line('Total:'||(count80+count81+count82+count87));
  dbms_output.put_line('1980:'|| count80);
  dbms_output.put_line('1981:'|| count81);
  dbms_output.put_line('1982:'|| count82);
  dbms_output.put_line('1987:'|| count87);
end;

实例书写2
/*
1、SQL语句
selet empno,sal from emp order by sal;
—> 光标 —> 循环 —> 退出:1. 总额>5w 2. notfound

2、变量:()初始值 ()最终如何得到
涨工资的人数: countEmp number := 0;
涨后的工资总额:salTotal number;
(1)select sum(sal) into salTotal from emp;
(2)涨后=涨前 + sal *0.1

练习: 人数:8 总额:50205.325
*/

declare
cursor cemp is select empno,sal from emp order by sal;
pempno emp.empno%type;
psal   emp.sal%type;
--涨工资的人数: 
countEmp number := 0;
--涨后的工资总额:
salTotal number;
begin
    --得到工资总额的初始值
    select sum(sal) into salTotal from emp;

open cemp;
loop
     -- 1. 总额 >5w
     exit when salTotal > 50000;
     --取一个员工
     fetch cemp into pempno,psal;
     --2. notfound
     exit when cemp%notfound;
     
     --涨工资
     update emp set sal=sal*1.1 where empno=pempno;
     --人数+1
     countEmp := countEmp +1;
     --涨后=涨前 + sal *0.1
     salTotal := salTotal + psal * 0.1;

end loop;
close cemp;

commit;
dbms_output.put_line('人数:'||countEmp||'    总额:'||salTotal);
end;

实例书写3
/*
1、SQL语句
部门:select deptno from dept; —> 光标
部门中员工的薪水: select sal from emp where deptno=?? —> 带参数的光标

2、变量:()初始值 ()最终如何得到
每个段的人数
count1 number; count2 number; count3 number;
部门的工资总额
salTotal number := 0;
(1)select sum(sal) into salTotal from emp where deptno=??
(2)累加
*/
declare
–部门
cursor cdept is select deptno from dept;
pdeptno dept.deptno%type;

  --部门中员工的薪水
  cursor cemp(dno number) is select sal from emp where deptno=dno;
  psal emp.sal%type;
  
  --每个段的人数
  count1 number; count2 number; count3 number;
  --部门的工资总额
  salTotal number := 0;
begin
  --部门
  open cdept;
  loop
       --取一个部门
       fetch cdept into pdeptno;
       exit when cdept%notfound;
       --初始化
       count1:=0; count2:=0; count3:=0;
       --得到部门的工资总额
       select sum(sal) into salTotal  from emp where deptno=pdeptno;
       --取部门的中员工薪水
       open cemp(pdeptno);
       loop
            --取一个员工的薪水
            fetch cemp into psal;
            exit when cemp%notfound;
            --判断
            if psal < 3000 then count1:=count1+1;
               elsif psal >=3000 and psal<6000 then count2:=count2+1;
               else count3:=count3+1;
            end if;
       end loop;
       close cemp;
       --保存结果
       insert into msg values(pdeptno,count1,count2,count3,nvl(saltotal,0));

  end loop;
  close cdept;
  
  commit;
  dbms_output.put_line('完成');
  
end;
posted @ 2019-09-18 18:25  一剑霜寒十九洲  阅读(501)  评论(0编辑  收藏  举报