目录
PLSQL基础语法(二)
选择结构
改变程序的执行顺序
选择一个结果
条件为bool类型,只能选择一个执行,
if和case两种
if结构,if、 if else、多重if
case结构,简单case、 搜索case
可以随意嵌套,两种方法都可以互相实现,选择更适合的方法实现
IF语句
简单判断语句
if 条件表达式 then plsql语句; end if;
带判断不成立语句
if 条件表达式 then 条件成立时执行的语句;
else 条件不成立时执行的语句; end if;
多判断语句
if 条件表达式1 then 条件1成立时执行的语句;
elsif 条件表达式2 then 条件2成立时执行的语句;
... elsif 条件表达式n then 条件n成立时执行的语句;
else 所有条件都不成立时执行的语句;
end if;
IF语句注意事项:
在IF语句中的三种格式中,都必须使用关键字 end if来结束,并且中间需要有一个空
格。
关键字elsif 中没有字母E
整个if 语句中只在end if后存在分号;而之前的if 、then、else 、elsif 中都没有分号
当判断if以及else 、elsif 中的同时有两个以上返回true,也只会执行第一个语句。
当我们遇到一个plsql语句不需要我们做任何事时,就可以使用null语句来填充。系统运行
到null语句后会自动向下继续运行而不是中断执行。
null语句格式:null;
当遇到if语句必须要跟一个执行语句的情况时,就可以在后面写入null ;或者在标签后写
入null来跳转到程序的最后完成运行。
declare
sex varchar2(10):='&sex';
begin
if sex='女' then dbms_output.put_line('小糯米');
else dbms_output.put_line('周杰伦');
end if;
end;
declare
sex varchar2(10):='&sex';
begin
if sex='女' then dbms_output.put_line('小糯米');
elsif sex='男' then dbms_output.put_line('周杰伦');
else dbms_output.put_line('人妖');
end if;
end;
--输入性别和时间,女并且小于10秒为冠军
declare
sex varchar2(10):='&sex';
run number(2):=&run;
begin
if sex='女' then dbms_output.put_line('小糯米');
if run<10 then dbms_output.put_line('冠军');
end if;
elsif sex='男' then dbms_output.put_line('周杰伦');
else dbms_output.put_line('人妖');
end if;
end;
CASE 语句
简单CASE语句
case 表达式
when 匹配值 then 执行语句
when 匹配值 then 执行语句
......
else 执行语句
end case;
搜索型CASE语句
case
when 表达式 then 执行语句
when 表达式 then 执行语句
......
else 执行语句
end case;
一旦满足其中一个条件并执行语句后,整个case语句就完成了。else是可选的,如果没有
那么抛出case_not_found 异常,when表达式是按照从上到下依次执行.
在plsql语句中也可以单独使用sql语句中的case表达式进行处理,在case表达式中只返回
一个单独的值用于后续处理使用。
declare
week number(4):=6;
begin
case week
when 6 then
dbms_output.put_line('休息');
when 7 then
dbms_output.put_line('休息');
else
dbms_output.put_line('干活');
end case;
end;
declare
week number(4):=6;
begin
case
when week>5 then
dbms_output.put_line('休息');
else
dbms_output.put_line('干活');
end case;
end;
作业
--1.输入两个数字判断两个数字的大小
declare
a number(6,3):=&输入a的值;
b number(6,3):=&输入b的值;
begin
if a>b then dbms_output.put_line('a更大');
elsif b>a then dbms_output.put_line('b更大');
else dbms_output.put_line('都挺大的');
end if;
end;
--2.输入一个数字输出这个数字是偶数还是奇数
declare
n number(4):=&输入一个数字判断奇偶;
begin
if mod(n,2)=0 then dbms_output.put_line('这是偶数');
else dbms_output.put_line('这是奇数');
end if;
end;
--3.判断一个日期是否是星期六或星期日,休息日则开耍,上班日则搬砖
declare
DayTime date:=to_date('&输入一个日期,精确到日','yyyymmdd');
begin
if to_char(DayTime,'day')='星期六'
or to_char(DayTime,'day')='星期日'
then dbms_output.put_line('这天是休息日,开耍!');
else dbms_output.put_line('搬砖');
end if;
end;
/*4.判断一个年份是否是闰年,400整除是世纪闰年,100不整除并且被4整除是闰年,其余
是平年*/
declare
ryear number(5):=&输入一个年份;
begin
if mod(ryear,400)=0 or mod(ryear,100)!=0 and mod(ryear,4)=0
then dbms_output.put_line('这个年份是闰年');
else dbms_output.put_line('这个年份是平年');
end if;
end;
/*5.请输入一个员工编号,如果是10号部门则员工上调工资10%,如果是20号部门则工资
上调20%,如果是30号部门则工资上调30%*/
declare
sempno emp.empno%type:=&请输入一个员工编号,根据其部门号涨薪;
dempno emp.deptno%type;
begin
select distinct deptno into dempno from emp
where empno=sempno;
if dempno=10
then update emp set sal=sal*1.1
where empno=sempno;
elsif dempno=20
then update emp set sal=sal*1.2
where empno=sempno;
elsif dempno=30
then update emp set sal=sal*1.3
where empno=sempno;
else dbms_output.put_line('该员工不存在或没有涨薪资格!');
end if;
end;
--6.输入三个数,不考虑相等,有小到大打印输出
create table AbcNumber(
sNumber number(6,3));--建一个表
declare
a AbcNumber.sNumber%type:=&输入数值a;
b AbcNumber.sNumber%type:=&输入数值b;
c AbcNumber.sNumber%type:=&输入数值c;
roww number(20);--装载排名最小值
maxroww number(20);--装载排名最大值
ABC AbcNumber.sNumber%type;--将数据逐个装入并输出用的参数
begin
insert into AbcNumber values(a);
insert into AbcNumber values(b);--将数据插入表中一列
insert into AbcNumber values(c);
select r into roww from(
select row_number()over(order by sNumber asc) r from AbcNumber
) where r=1;--装载排名最小值
select max(r) into maxroww from(
select row_number()over(order by sNumber asc) r from AbcNumber
);--装载排名最大值
for i in roww .. maxroww--将数据逐个装入并输出
loop
select sNumber into ABC from(
select sNumber,row_number()over(order by sNumber asc) r from AbcNumber )
where r=i;
dbms_output.put_line(ABC);
end loop;
end;
选择结构语句判定示意图:
循环语句
循环具备的两个条件:循环条件和循环操作
条件为bool类型,plsql的循环能够让一段代码反复执行,为实现这一功能一共提供了三
种不同的循环结构:
loop简单循环或无限循环,其他语言叫do while
for循环
while循环
循环结构
三种循环各有差异但每个结构都包含两个部分:循环边界以及循环体。循环边界有一些
保留词组成,包括初始化循环、终止循环条件、完成循环的 end loop 语句。
循环结构和选择结构随意嵌套,同一功能可以互相实现,选择合适的方法
简单循环
以loop开始到end loop结束的循环结构。靠循环体中exit、exit when。
简单循环的特性:
属性
描述
结束循环语句
简单循环通过exit语句或者 exit when 语句结束循环
结束循环语句
位置
结束循环语句放置在循环体内,该语句需要至少被执行一次,不然就
会变成无限循环。
简单循环使用
场景
当不能确认循环需被执行次数时使用或者保障循环体至少被执行一次
时使用。
--简单循环
declare
n number :=0;--初始值
begin
loop
n:= n+1;--自增
dbms_output.put_line(n);
exit when n>=10 ; --停止条件
end loop;
end;
WHILE循环
while循环时一个条件循环,只要循环边界处定义的布尔条件的值为真,循环就会继续。
while循环的的格式:
while 条件判断
loop
执行语句
end loop;
while循环的特性:
属性
循环结束语句:当循环边界的布尔表达式为false 或者null时循环结束。
结束循环语句位置
结束循环语句:放在while关键字后,在循环体要执行前进行判断,所以
while循环可能一次都不会执行循环体。
while循环使用场景 :
无法明确循环体会循环几次,但有明确的循环停止条件,并且循环体
不是一定要执行的情况使用 while循环。
--while循环
declare
n number :=0;--初始值
begin
while n<10 --停止条件
loop
n:= n+1;--自增
dbms_output.put_line(n);
end loop;
end;
FOR循环
for循环有两种类型:数值型for循环和游标型for循环。数值型for循环的循环次数在循环开始时已经确认,而游标型for循环是和select语句关联在一起循环。
数值型for循环
数值型for循环格式:
for 循环索引 in [reverse] 小数值 .. 大数值
loop
循环体
end loop;
数值型for循环的特性
数值型for循环的规则
1、不需要对循环索引进行变量声明,系统会自动隐式声明一个integer数据类型的变量。
2、在范围部分使用算式会在循环开始时进行求值一次,且不会随着循环的反复执行被重复求值。如果在循环体中改变了范围表达式的变量也不会对范围表达式的值产生影响
3、使用reverse进行递减循环时不需要将大数值和小数值进行颠倒输入依然先小再大表示。
--for循环
begin
for n in 1..10
loop
dbms_output.put_line(n);
end loop;
end ;
begin
for n in reverse 1..10
loop
dbms_output.put_line(n);
end loop;
end ;
--配合函数的for循环
declare
str varchar2(100);
endstr varchar2(100);
begin
str:='两只老虎';
for n in 1 .. length(str)
loop
endstr :=substr(str,n,1)||endstr;
end loop;
dbms_output.put_line(endstr);
end;
作业2
--1、写一个循环,输出20-40
begin
for i in 20 .. 40
loop
dbms_output.put_line(i);
end loop;
end;
--2、从1-50的单数,倒序
begin
for i in reverse 1 .. 50
loop
if mod(i,2)!=0
then dbms_output.put_line(i);
end if;
end loop;
end;
--3、输出a-z
begin
for i in ascii('a') .. ascii('z')
loop
dbms_output.put_line(chr(i));
end loop;
end;
--4、计算并显示 1 到 100 之间的奇数之和
declare
jsum number(9):=0;
begin
for i in 1 .. 100
loop
if mod(i,2)!=0
then jsum:=jsum+i;
end if;
end loop;
dbms_output.put_line(jsum);
end;
--5、倒序功能,输入我爱你你爱我蜜雪冰城甜蜜蜜,打印倒序输出
declare
HoneySnowIceCity varchar2(50):='&输入我爱你你爱我蜜雪冰城甜蜜蜜';
begin
for i in 1 .. length(HoneySnowIceCity)
loop
dbms_output.put(substr(HoneySnowIceCity,-i,1));
end loop;
dbms_output.put_line(null);
end;
/*6、有若干只鸡兔同在一个笼子里,从上面数有35个头,从下面数有94只脚。问笼中各有多少只鸡和兔?*/
declare
Chicken number(4);
Rabbit number(4);
begin
for Chicken in 0 .. 35
loop
Rabbit:=35-Chicken;
if (2*Chicken+Rabbit*4)=94
then dbms_output.put_line('笼中有'||Chicken||'只鸡和'||Rabbit||'只兔');
end if;
end loop;
end;
/*7、猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。*/
declare
peach number(5):=1;
begin
for i in reverse 1 .. 9
loop
peach:=2*(peach+1);
end loop;
dbms_output.put_line('第一天摘了'||peach||'个桃子');
end;
遗忘复习
If 判定等号为=,不是:=。
Ascii()字符转ascii码,chr()ascii码转字符。
instr(字符串,寻找字符,开始寻找位置,寻找出现的第几个该字符)
示例:instr(‘aaabbccc’,’b’,1,1) 返回4.
Instr(‘aaabbbbbccc’,’b’,5,4) 返回8.
找不到返回0.
Substr(字符串,开始截取位置,最后截取位置(不写则后面都截取))
mod(n,m)求n除以m的余数