当前位置: 首页 > article >正文

Oracle之PL/SQL流程控制语句(二)

1、流程控制语句

可以控制程序执行的流程,包括如下三类:
1、控制语句:if 语句
2、循环语句:loop 语句,exit 语句
3、顺序语句:goto 语句,null 语句

2、条件控制

1、if 语句

if 语句根据条件执行一系列语句,有三种形式:if-then、if-then-else 和 if-then-elsif-then-else

1、if 语句

语法:

if 条件表达式 then
  plsql语句;
end if;

语义:如果条件表达式成立,那么执行then后面的plsql代码,如果条件不成立,跳过if语句执行其他语句。如:

declare
  --声明一个变量用来存放从键盘输入的值
  v_str varchar2(20);
begin
  --从键盘输入一个颜色字符串存入变量v_str
  v_str:='&请输入一个颜色';
  --判断输入的颜色是否为red,如果是red,输出它是红色,如果不是输入其他颜色
  if v_str='red' then
    dbms_output.put_line('它是红色');
  end if;
  if v_str!='red' then
    dbms_output.put_line('其他颜色');
  end if;
end;
2、if - else 语句

语法:

if 条件表达式 then
  plsql语句;
else
  plsql语句;
end if;

语义:如果if的条件表达式成立,执行then后面的代码,如果条件不成立,执行else后面的代码。如:

declare
  --声明一个变量用来存放从键盘输入的值
  v_str varchar2(20);
begin
  --从键盘输入一个颜色字符串存入变量v_str
  v_str:='&请输入一个颜色';
  if v_str='red' then
    dbms_output.put_line('它是红色');
  else
    dbms_output.put_line('其它颜色');
  end if;
end;
  
3、elsif 语句

语法:

if 条件表达式1 then
  plsql语句1;
elsif 条件表达式2 then
  plsql语句2;
...
elsif 条件表达式n then
  plsql语句n;
else
  plsql语句;
end if;

语义:如果条件表达式1成立,执行语句1,如果条件1不成立,判断第二个条件表达式,如果成立执行语句2,不成立判断下一条件,如果所有条件都不成立,执行else后面的语句。其中elsif可以有多个,else部分可省略。如:

--根据输入的字符串判断是什么动物
declare
  --声明一个字符串变量保存输入的内容
  v_str varchar2(20);
begin
  --用变量v_str接收输入的数据
  v_str:='&animal';
  --如果是 dog ,输出它是一只狗
  if v_str='dog' then
    dbms_output.put_line('它是一只狗');
  --如果是 cat ,输出它是一只猫 
  elsif v_str='cat' then
    dbms_output.put_line('它是一只猫');
  --如果是 pig ,输出它是一只猪
  elsif v_str='pig' then
    dbms_output.put_line('他是一只猪');
  else
    --输出其它生物
    dbms_output.put_line('其他生物');
  end if;
end;

2、case 语句

语法1:

case
  when 条件表达式1 then1;
  when 条件表达式2 then2;
  when 条件表达式3 then3;
 ...
 else
   默认值;
end case;

语法2:

case
  when1 then
    plsql语句1;
  when2 then
    plsql语句2;
  ...
  when 值n then
    plsql语句n;
 ...
 else
   plsql语句;
end case;

语义:如果条件表达式的值等于某个when后面的值,那么就执行相应then后面的plsql语句,如果表达式的值没在when所列的值中,那么执行else后面的语句,其中else部分可以省略。如:

--根据输入的字符串判断是什么动物
declare
  --声明一个字符串变量保存输入的内容
  v_str varchar2(20);
begin
  --用变量v_str接收输入的数据
  v_str:='&animal';
  case v_str 
    when 'dog' then
      --如果是dog,输出它是一只狗
      dbms_output.put_line('它是一只狗');
    when 'cat' then 
      --如果是cat,输出它是一只猫
      dbms_output.put_line('它是一只猫');
    when 'pig' then
      --如果是pig,输出它是一只猪
      dbms_output.put_line('它是一只猪');
    else
      --输出其它生物
      dbms_output.put_line('其它生物');
  end case;
end;

3、循环控制

循环控制用于重复执行一系列语句,循环控制有三种类型:
loop – 无条件循环
while – 根据条件循环
for – 循环固定的次数

1、loop循环

语法:

loop
  plsql语句;
  exit when 退出循环条件;
  循环控制语句;
end loop;

如:

--循环打印1到9的9个数字
declare
  --声明一个变量,用来存放一个数字(循环变量)
  v_n number(10);  --可以在此处赋值
begin
  --给循环变量赋值为1
  v_n:=1;
  --循环语句
  loop
    --循环体执行的plsql语句
    dbms_output.put_line(''||v_n);
    --退出循环条件
    exit when v_n=9;
    --改变循环变量的值,保证循环不会死魂环(循环控制语句)
    v_n:=v_n+1;
  end loop;
  dbms_output.put_line('v_n='||v_n);
end;

exit when:退出循环关键字,如果条件成立立即退出循环
continue:退出本次循环,不会结束循环
return:退出程序,结束整个循环

2、while 循环

语法:

while 循环条件 loop
  --循环体结构,循环控制语句
end loop;

如:

--循环打印1到9
declare
  --声明一个变量,来控制循环
  v_n number(10);
begin
  --给循环变量赋值
  v_n:=1;
  --while循环语句
  while v_n<10 loop
    --循环体语句(打印数字)
    dbms_output.put_line(''||v_n);
    --循环控制语句
    v_n:=v_n+1;
  end loop;
  dbms_output.put_line('v_n='||v_n);
end;

3、for 循环

语法:

for 循环变量 in [reverse] 集合|查询语句|游标变量 loop
  循环体语句
end loop;

循环变量:不需要在declare中声明。变量类型,根据in后面的集合或者查询语句而定,普通数据类型,record类型
reverse:可选参数,表示循环的方向,不加表示从开始到结尾,
加上表示从结尾到开头
数字类型集合写法:
minValue … maxValue 例如:1.。10
如:

--循环打印1到9
begin
  --for循环语句
  for i in 1..9 loop
    --循环体结构
    dbms_output.put_line(''||i);
  end loop;
end;

for 循环查询结果集

--循环打印dept表中的部门信息
begin
  --for循环语句,循环变量v_dept是一个记录类型,查询语句是dept%rowtype
  for v_dept in (select * from dept)loop
    --循环体结束,打印部门信息
    dbms_output.put_line(v_dept.deptno||','||v_dept.dname||','||v_dept.loc);
  end loop;
end;
--循环打印dept表中的部门信息
begin
  --for循环语句,循环变量v_dept是一个记录类型,查询语句是dept%rowtype
  for v_dept in (select * from dept where deptno=&deptno)loop
    --循环体结束,打印部门信息
    dbms_output.put_line(v_dept.deptno||','||v_dept.dname||','||v_dept.loc);
  end loop;
end;

select into 语句:
语法:select 列名,列名,,,列名 into 变量1,变量2,,,,变量n | record变量 | rowtype 变量 from 表名 where 条件;
注意:select into语句查询出的结果只能是一条数据,超过一条数据会报错

--输入一个部门编号,打印这个部门的信息
declare
  --声明一个变量用来保存输入的部门编号
  v_deptno number(10);
  --声明一个dept%rowtype类型的变量来保存一条部门信息
  v_dept dept%rowtype;
begin
  --接收从键盘输入的部门编号
  v_deptno:=&deptno;
  --根据输入的部门编号查询出部门信息
  select * into v_dept from dept where deptno=v_deptno;
  --打印部门信息
  dbms_output.put_line(v_dept.deptno||','||v_dept.dname||','
    ||v_dept.loc);
end;
--输入一个部门编号,打印这个部门的信息
declare
  --声明一个变量用来保存输入的部门编号
  v_deptno number(10);
  --声明一个变量用来保存部门编号
  v_dno dept.deptno%type;
  --声明一个变量用来保存部门名称
  v_dname dept.dname%type;
  --声明一个变量用来存放部门位置
  v_loc dept.loc%type;
begin
  --接收从键盘输入的部门编号
  v_deptno:=&deptno;
  --根据输入的部门编号查询出部门信息
  select deptno,dname,loc into v_dno,v_dname,v_loc from dept where deptno=v_deptno;
  --打印部门信息
  dbms_output.put_line(v_dno||','||v_dname||','||v_loc);
end;

4、顺序控制

顺序控制用来按顺序执行语句,程序控制语句包括:
goto 语句 – 无条件的转到标签指定的语句
null 语句 – 什么也不做的空语句

1、goto 语句

plsql中goto语句是无条件跳转到指定的标号去的意思,语法如下:

<<lable>>
  循环执行的plsql语句
if 条件 then
  goto label;
end if;

<<>>:标签定义符
label:标签名,符合标识符命名规范
goto 语句:程序回到标签处执行

--循环打印1到9
declare
  v_n number(10):=1;
begin
  <<mylable>>
  dbms_output.put_line(''||v_n);
  v_n:=v_n+1;
  if v_n<10 then
    goto mylable;
  end if;
end;

2、null 语句

null :plsql中的空语句,它什么也不做,相当于一个占位符,可以使某些语句变得有意义,提高程序的可读性,如:

begin
  ...
  if v_num is null then
    goto print1;
  end if;
  ...
  <<print1>>
  null;  --不需要处理任何数据
end;

http://www.kler.cn/news/8048.html

相关文章:

  • linux centos 系统提示No space left on device错误 centos清理硬盘空间
  • Ubuntu22安装OpenJDK
  • java中static{}是什么意思(IT枫斗者)
  • chatGPT写文章提问词-chatGPT生成论文要多久
  • JavaScript 进阶 - 0基础第三天
  • Android上的libcurl
  • ToBeWritten之杂项
  • uds的0x14服务介绍
  • ToBeWritten之物联网 BlueTooth/BLE 协议
  • 中金支付经历了4个月完成主要出资人前置审批
  • 关于Dataset和DataLoader的概念
  • Charles 安装及配置,详细步骤(不错,保存一下)
  • Hibernate的一级缓存是什么?具有哪些特点?
  • Linux系统编程(三)—— 文件编程(1)目录和文件
  • Python 常函数
  • 00后也太卷了吧!进厂起薪18K,原来面试时候都说了这些......
  • 操作技巧 | Revit中如何新建系统类型并赋予颜色?
  • PTA L1-003 个位数统计(15分)C语言
  • 每日做题总结——day01
  • 分布式锁介绍及解决方案