Oracle 数据库入门之----------------------PL/SQL 基本语法

这篇博客介绍了Oracle数据库中的PL/SQL基本语法,包括打印输出、用户输入处理、记录型变量、循环结构、存储过程以及异常处理。通过实例展示了如何使用DBMS_OUTPUT.PUT_LINE函数、条件判断、光标操作以及事务管理。内容涵盖了从简单的Hello World输出到复杂的员工薪资调整和部门工资统计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

--打印Hello World

 

declare

  --说明部分

begin

  --程序

  dbms_output.put_line('Hello World');

end;

-- 判断用户从键盘输入的数字

--接受键盘输入

--变量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;

 

 

--记录型变量: 查询并打印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;

 

-- 打印1~10

declare 

  -- 定义变量

  pnum number := 1;

begin

  loop

    --退休条件

    exit when pnum > 10;

    

    --打印

    dbms_output.put_line(pnum);

    --加一

    pnum := pnum + 1;

  end loop;

end;

 

打印Hello World

存储过程:

1exec sayhelloworld();

2begin

sayhelloworld();

sayhelloworld();

   end;

   /

 

create or replace procedure sayhelloworld

as

   --说明部分

begin

   dbms_output.put_line('Hello World');

 

end;

 

-- 查询并打印员工的姓名和薪水

/*

光标的属性: %isopen   %rowcount(影响的行数)

             %found    %notfound

 

*/

declare 

   --定义光标(游标)

   cursor cemp is select ename,sal from emp;

   pename emp.ename%type;

   psal   emp.sal%type;

begin

  --打开

  open cemp;

 

  loop

       --取当前记录

       fetch cemp into pename,psal;

       --exit when 没有取到记录;

       exit when cemp%notfound;

       

       dbms_output.put_line(pename||'的薪水是'||psal);

  end loop;

 

  --关闭

  close cemp;

end;

 

-- 查询某个部门的员工姓名

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;

 

/*
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;

 

/*
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;

 

/*
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;

 

PL/SQL ------系统例外

-- 被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;

 

PL/SQL------自定义例外

-- 查询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;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值