【Oracle数据库】pl/sql的循环与判断

本文介绍了Oracle数据库中的PL/SQL基础语法,包括直接定义变量、调用表中字段定义变量、声明参数的方法。详细讲解了如何使用if语句和CASE结构进行条件判断,以及while、loop循环的运用。此外,还探讨了使用goto标记的跳转以及通过游标进行数据处理的方法。

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

pl/sql基础语法

  • PL/SQL :是SQL语言的拓展,过程化SQL语言

  • PL(Procedural Language):过程语言

  • SQL:结构化查询语言

  • 分为三个部分:声明部分、可执行部分、异常处理部分

declare
       声明部分:声明变量、常量、类型、游标
begin
       执行部分:存储过程以及SQL语句  (逻辑代码)       
exception   (可选)
       异常部分:处理异常
end;

直接定义变量


declare
         abc_name varchar2(10);
         abc_empno number(10);
         t_emp emp%rowtype;
         
begin    
         /* 将emp表中特定的ename和empno赋给t_emp中对应属性 */
         select ename,empno into t_emp.ename,t_emp.empno from emp 
         where empno=&empno;
         /* 打印必背 */
         dbms_output.put_line('你好'||t_emp.ename||t_emp.empno);
end;

调用表中字段定义变量

declare
       abc_name emp.ename%type;
       abc_empno number(10);
       
       t_emp  emp%rowtype;
  

begin
       select ename, empno into t_emp.ename ,t_emp.empno from emp  where empno = &empno;
       dbms_output.put_line('你好'||t_emp.ename||t_emp.empno);
/*       dbms_output.put_line(abc_empno);*/
--exception 异常
/*         when no_data_found then
           操作 */
end;

声明参数的方法

  • 方法1
declare
  v_ename  VARCHAR2(10);
  v_comm   NUMBER(7, 2);
  v_empno number(10);
  • 方法2
declare
  v_ename  emp.ename%type;
  v_sal    emp.sal%type;
  • 方法3
declare    
    v_emp emp%rowtype;
  • 方法4
declare

  type v_canshu is record( v_sal   NUMBER(7, 2), v_ename emp.ename%type,  v_emp   emp%rowtype);
  v_canshuji v_canshu;

判断

请使用复制的emp表,不要直接修改emp表

if语句

  • 判断员工奖金在100和1000之间的奖金加500,打印出员工姓名、员工奖金
declare
  v_ename  VARCHAR2(10);
  v_comm   NUMBER(7, 2);
  v_empno number(10);

begin
  --查询
  select ename, comm ,empno into v_ename, v_comm ,v_empno from emp01 where empno = &empno;
  --打印
  dbms_output.put_line('员工姓名:' || v_ename || '员工薪资:' || v_comm);

  --判断
  if (v_comm >100 and v_comm <1000)  then
    update emp01 set comm = 500 where empno = v_empno;
/*  elsif 条件 then
    执行语句;
  elsif 条件 then
    执行语句;
  elsif 条件 then
    执行语句;*/
  else
    --必须加可执行语句(不能为空)
    null; --是可执行的语句,但是不会做任何的事情
  end if;

end;

/*查看emp01是否被修改*/
select * from emp01;
  • 判断员工工资在1000和2000之间则奖金加200,工资在2000和3000之间奖金加300,其他的奖金不变,打印出员工姓名和员工工资
declare
  v_ename  emp.ename%type;
  v_sal    emp.sal%type;

begin
  --查询
  select ename, sal into v_ename, v_sal from emp01 where empno = '7788';
  --打印
  dbms_output.put_line('员工姓名:' || v_ename || '员工薪资:' || v_sal);

  --判断
  if (v_sal between 1000 and 2000) then
    --满足条件执行
    update emp01 set comm = nvl(comm, 0) + 200 where ename = v_ename;
  elsif (v_sal between 2000 and 3000) then
    update emp01 set comm = nvl(comm, 0) + 300 where ename = v_ename;
  else
    --必须加可执行语句(不能为空)
    null; --是可执行的语句,但是不会做任何的事情
  end if;

end;
  • 查询工号7788的员工姓名和工资
declare

  type v_canshu is record( v_sal   NUMBER(7, 2), v_ename emp.ename%type,  v_emp   emp%rowtype);
  v_canshuji v_canshu;
  
begin

  select sal, ename
    into v_canshuji.v_sal, v_canshuji.v_ename
    from emp
   where empno=7788;
  dbms_output.put_line(v_canshuji.v_sal || v_canshuji.v_ename);

end;

CASE

  • 语法
       CASE 
           WHEN 条件  THEN 
             执行事件;
           WHEN 条件  THEN 
             执行事件;  
           ELSE 
             剩余条件下执行事件; 
       END CASE;              
  • 根据工资判断是否有钱
select empno,
       ename,
       sal,
       (case
         when sal between 1 and 1000 then
          '初级'
         when sal between 1000 and 2000 then
          '中级'
         when sal between 2000 and 3000 then
          '高级'
         else
          '有钱人'
       end) 等级
  from emp1;

循环

while循环

declare

  --声明变量
  v_ano number := 1;

begin
  --while循环(v_ano>10进入循环)
  while (v_ano < 10) loop
  
    --打印次数  
    dbms_output.put_line('while循环次数:' || v_ano);
  
    --循环条件
    v_ano := v_ano + 1;
  
  --结束循环
  end loop;

end;

loop循环

declare

  --声明变量
  v_bno number := 1;
  
begin

  --loop循环
  loop
  
    --打印循环次数
    dbms_output.put_line('loop循环次数:' || v_bno);
  
    --执行操作
    v_bno := v_bno + 1;
  
    --循环退出条件
    exit when v_bno > 10;
    
  --结束循环
  end loop;
  
end;

–3、for in 循环

declare

begin

  --设置循环条件   v_cno 是变量,但是在for循环里面不需要声明
  for v_cno in 1 .. 10 loop
  
    dbms_output.put_line('for循环次数:' || v_cno);
  
  end loop;

end;

对比(使用goto标记跳转)

declare
  v_dno number := 1;
begin

  --goto表示无条件跳转到指定的标记位置   注:不区分大小写
  goto forxh;
  while (v_dno < 10) loop
    dbms_output.put_line('while循环:' || v_dno);
    v_dno := v_dno + 1;
  end loop;
  loop
    exit when v_dno > 20;
    dbms_output.put_line('loop循环:' || v_dno);
    v_dno := v_dno + 1;
  end loop;
  --<<标签分隔符>>
  <<forxh>> --定义标记名称
  for v_eno in 1 .. 10 loop
    dbms_output.put_line('for循环' || v_eno);
  end loop;
end;

使用游标

declare
    e_emp emp%rowtype;
    cursor s1 is select * from emp;
begin
    for e_emp in s1 loop
      case
        when e_emp.sal <1000 then
          dbms_output.put_line('初级'||e_emp.ename);
        when e_emp.sal between 1000 and 2000 then
          dbms_output.put_line('中级'||e_emp.ename);
        when e_emp.sal between 2000 and 3000 then
          dbms_output.put_line('高级'||e_emp.ename);
        else
          dbms_output.put_line('有钱人'||e_emp.ename);
        end case;
        end loop;
end;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值