【oracle】选择结构、循环结构
1、选择结构:if、then、else、end if
格式:
IF 条件表达式 THEN
语句段
END IF;
IF 条件表达式 THEN
语句段1
ELSE
语句段2
END IF;
课堂练习
1.接收用户的输入,要求长度不少于6个字符,如果输入正确,则输出用户输入的信息。否则,显示“输入长度不够”
方案1:
declare
v_str varchar2(50) := '&a';
v_len number(5);
begin
select length(v_str) into v_len from dual;
if v_len>=6 then
dbms_output.put_line(v_str);
else
dbms_output.put_line('输入长度不够');
end if;
end;
方案2:
declare
v_str varchar2(50) := &a;
begin
if length(v_str)>=6 then
dbms_output.put_line(v_str);
else
dbms_output.put_line('输入长度不够');
end if;
end;
注意⚠️:上面的结果并不正确,提示此表达式的类型声明不完整或格式不正确。
因为输入的是字符串,所以在输入的时候,字符串要加上单引号。
或者在定义的时候加上引号,如下:
declare
v_str varchar2(50) := '&a';
begin
if length(v_str)>=6 then
dbms_output.put_line(v_str);
else
dbms_output.put_line('输入长度不够');
end if;
end;
'&a’加上了单引号,就能够正常运行结果了。
2. 测试用户输入的日期是否是周末,(星期六或星期日)
方案1:
declare
v_day varchar2(10);
v_str date := '&a';
c_one constant varchar2(5) := '星期六';
c_two constant varchar2(5) := '星期日';
begin
v_day:=to_char(v_str,'day');
dbms_output.put_line('这一天是:' || v_day);
case v_day
when v_day = c_one then
dbms_output.put_line(',今天是周末');
when v_day = c_two then
dbms_output.put_line(',今天是周末');
else
dbms_output.put_line(',今天不是周末');
end case;
end;
上面的代码输入的格式:09-12月-21
方案2:
declare
v_day varchar2(10);
v_str date := '&a'
begin
v_day:=to_char(v_str,'day');
if v_str='星期六' or v_str='星期日' then
dbms_output.put_line(',今天是周末');
else
dbms_output.put_line(',今天不是周末');
end case;
end;
上面的代码输入的格式:09-12月-21
方案3:
declare
v_day varchar2(10);
v_str date := '&a'
begin
v_day:=to_char(v_str,'day');
if v_str in('星期六','星期日') then
dbms_output.put_line(',今天是周末');
else
dbms_output.put_line(',今天不是周末');
end case;
end;
上面的代码输入的格式:09-12月-21
方案4:通过自己想要输入的格式输入字符串进行输出当前星期几
declare
v_day varchar2(10);
v_str date;
v_input varchar2(20) := '&input';
begin
v_str := to_date(v_input,'yyyy-mm-dd');
v_day:=to_char(v_str,'day');
if v_day in('星期六','星期日') then
dbms_output.put_line(',今天是周末');
else
dbms_output.put_line(',今天不是周末');
end case;
end;
上面的代码输入的格式:2022-8-18
方案5:通过自己想要输入的格式输入字符串进行输出当前星期几
declare
v_day varchar2(10);
v_str date;
v_input varchar2(20) := '&input';
begin
v_str := to_date(v_input,'yyyy"年"mm"月"dd"日"');
v_day:=to_char(v_str,'day');
if v_day in('星期六','星期日') then
dbms_output.put_line(',今天是周末');
else
dbms_output.put_line(',今天不是周末');
end case;
end;
上面的代码输入的格式:2022年8月18日
注意:在使用中文的时候,要使用英文的双引号将汉字包起来。
to_char()既可以字符转换也可以日期转换也可以数值转换
格式说明:(思路)
declare
v_riqi varchar2(10);--根据自己的格式输入日期,那么肯定不能定义成日期类型,要定义成字符串类型
v_date date; --因为要将日期转换为周末汉字的形式需要用到to_char()函数,该函数的一个参数传入的是date类型的
v_day varcahr2(10); --用于接收是星期几的字符串,所以也是varchar2字符串类型的
begin
v_date := to_date(v_riqi,'yyyy-mm-dd'); --将自己定义的日期类型的字符串转化为日期型的变量。
v_day := to_char(v_date,'day');--使用varcahr2将日期中的星期几提取出来
end;
3.如果职位是“analyst”,则薪水增加10%;否则增加5%
declare
v_no emp.empno%type := &no;
v_job emp.job%type;
begin
select job into v_job from emp where empno=v_no;
if v_job = 'analyst' then
update emp sey sal=sal*1.1 where empno=v_no;
else
update emp sey sal=sal*1.05 where empno=v_no
end if;
end;
验证:
验证:select * from emp;
观察sal的变化。
4、输入2个数值,小的数值作为第一个数先进行输出,大的数值作为第二个数后进行输出
declare
v_first number(4):=&one;
v_second v_first%type:=&two;
temp v_first%type;
begin
if v_first>v_second then
temp:=v_first;
v_first:=v_second;
v_second:=temp;
end if;
dbms_output.put_line('第一个数是:' || v_first || '第二个数是:' || v_second);
end;
2、多分枝结构(选择结构):if、then、elsif、else、end if
模板:
If condition1 then
Statement1
elsif condition2 then
Statement2
elsif condition3 then
Statement3
else
StatementN
end if;
注意:此处不同于Java等语言的else if,而是elsif
课堂练习
1、如果职位是"analyst",则薪水增加10%,如果职位是“CLERK”,则薪水增加20%,其余增加5%。
declare
v_no emp.empno%type := &no;
v_job emp.job%type;
begin
select job into v_job from emp where empno=v_no;
if v_job = 'analyst' then
update emp set sal=sal*1.1 where empno=v_no;
elsif v_job='clerk' then
update emp set sal=sal*1.2 where empno=v_no;
else
update emp set sal=sal*1.05 where empno=v_no;
end if;
end;
2、查询emp表中JAMES的工资,如果大于1500元,则发放奖金100元;如果工资大于900元,则发放奖金800元,否则发放奖金400元。
declare
v_sal = emp.sal%type;
v_comm = emp.comm%type;
begin
select sal,comm into v_sal,v_comm from emp where ename='JAMES';
if v_comm is null
update emp set comm = 0 where ename='JAMES';
if v_sal>1500
update emp set comm=comm+100 where ename='JAMES';
elsif v_sal>900
update emp set comm=comm+800 where ename='JAMES';
else
update emp set comm=comm+400 where ename='JAMES';
end if;
end;
3、选择结构:case、when、then、end case(选择器形式case)
语法:
case 变量或表达式
when 值1 then 语句1
[when 值2 then 语句2]
……
[else 语句n]
end case;
样例:输入字母,分别输出相对应的级别信息
declare
v_grade char(1):='&dj';
begin
case v_grade
when 'a' then
dbms_output.put_line(‘优秀’);
when 'b' then
dbms_output.put_line(‘良好’);
when 'c' then
dbms_output.put_line(‘一般’);
else
dbms_output.put_line('输错了');
end case;
END;
选择器形式的case后面是有值的。这个值对应于when后面的值。
选择器形式的when后面只能必须是一个具体的值,而不能是表达式。
4、选择结构:case、when、then、end case(搜索式case)
语法:
case
when 条件表达式1 then 语句1;
when 条件表达式2 then 语句2;
....
else 语句n;
end case ;
示例:
declare
score number :=70;
begin
case
when score>80 then
dbms_output.put_line('优秀');
when score>60 then
dbms_output.put_line('一般');
else
dbms_output.put_line('待努力 ');
end case;
end ;
说明:
搜索式when后面只能是逻辑表达式(表示真假的表达式),不能是确定的值。
搜索式case后面是没有值的。
搜索式与选择器式两种形式都是从上往下进行判断,从上往下走的时候如果找到了符合条件的when语句,就停止,不再往下找。
搜索式与选择器式两种形式都是遇到符合条件就退出,后面的语句将不再执行。
例:
when score>60 then
dbms_output.put_line('一般');
when score>80 then
dbms_output.put_line('优秀');
输入90,那么直接输出"一般"这个结果,因为第一个when就符合条件,就不再执行其他when后面的语句。
5、循环结构
1、基本循环
格式:
LOOP
循环体
Exit when condition
End loop
2、While循环
格式:
While 表达式 loop
循环体
End loop
3、For循环
格式:
For I in (reverse) 初始..终值 loop
循环体
End loop
说明:
如果是reserve,表示的是递减的,例100~1,不是reserve就是1~100
基本规则:
FOR循环的基本规则:
在循环中使用的计数器变量不需要声明,Oracle自动为for循环声明计数器变量
计数器的值只能为整数,所以for循环也叫数值型循环
计数器变量只能在循环体内引用,在循环体外不识别这个变量
如果需要在循环体外引用这个计数器的值,可以使用变量记录它的值
在循环中使用的计数器变量不需要声明,Oracle自动为for循环声明计数器变量。
4、课堂练习
1. 用三种循环方式求1到10的偶数和
1、基本循环:
declare
i number(2) := 1;
s number(2) :=0;
begin
loop
s:=s+i;
i:=i+1;
exit when i>10;
end loop;
dbms_output.put_line(s);
end;
注意⚠️:
exit when i>10; 表示的是当i>10的时候,循环停止并退出循环
基本循环中必须有能退出循环的语句,否则就是一个死循环,报错。
2、基本循环:
declare
i number(2) := 1;
s number(2) :=0;
begin
loop
s:=s+i;
i:=i+1;
if i>10 then
exit;
end if;
end loop;
dbms_output.put_line(s);
end;
上面使用了
if i>10 then
exit;
end if;
三行代码代替了exit when i>10;
这也是一种退出循环的一种方式
3、while循环:
declare
i number(2) := 1;
s number(2) :=0;
begin
while i<=10 loop
s:=s+i;
i:=i+1;
end loop;
dbms_output.put_line(s);
end;
4、for循环:
declare
-- i number(2) := 1;
s number(2) :=0;
begin
for i in 1..10 loop
s:=s+i;
-- i:=i+1;
end loop;
dbms_output.put_line(s);
end;
1…10表示1-10,而且包含1和10,这种情况下i值是自动增长的。
在上面的for循环代码块中,我注释了两行代码:i number(2) := 1;与i:=i+1;
这是因为FOR循环的基本规则:在循环中使用的计数器变量不需要声明,Oracle自动为for循环声明计数器变量,而且1…10表示1-10,而且包含1和10,这种情况下i值是自动增长的,所以我注释的两行代码都是多余的代码。
For循环:只适用于数值型循环。
2. 用户登录时,有可能会输入多余的空格,编写PL/SQL程序删除这些多余空格,并输出不包含多余空格的用户名。
Declare
name_old Varchar2(30) := ' a dminis tr ator ' ;
name1 Varchar2(30) ;
name_new Varchar2(30) := '';
len number(3) ;
i number := 1 ;
Begin
DBMS_Output.Put_Line('用户名原始内容:' || name_old ) ;
name_old :=Trim(name_old) ;
len := Length(name_old) ;
While i<len+1
Loop
name1 := Substr(name_old , i , 1) ;
-- DBMS_Output.Put_Line('截取的字符为:' || name1 );
If Length(Trim(name1)) != 0 Then
name_new := name_new || name1 ;
End If ;
i := i+1 ;
End Loop ;
DBMS_Output.Put_Line('去掉空格的用户名:' || name_new );
End ;
思路:先将原本的函数的两头进行去空格,然后对得到的字符串再进行一个字符一个字符的判断,若果是空格就不要,不是空格就要。
declare
str varchar2(100) := '&str'; --用于接收一个输入的字符串
len number; --定义一个接收字符串长度的变量
str2 varchar2(100) ; --定义一个接收删除字符串两头的空格之后的字符串的变量
s varchar2(10); --循环接收每一个字符
str_last varchar2(100); --用于存储最终的结果字符串
i number := 1; --用于循环的次数控制
begin
dbms('原本输入的字符串是:' || str);
str2 := tirm(str);
len := length(str2); --获取删除两头空格之后字符串的长度
while i<=len loop
s := substr(str2,i,1);
if length(trim(s) != 0) then
str_last := str_last || s;
end if;
i := i + 1;
end loop;
end;
5、常用的PL/SQL数学函数
![](https://i-blog.csdnimg.cn/blog_migrate/e748ba0b4c200a5e3d9ac56ef81ae15c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/946361dbd422b83680ec5cbbfe39cdb8.png)
6、常用的PL/SQL字符串函数
![](https://i-blog.csdnimg.cn/blog_migrate/2fe96d520cd8f2b3b2d020d8c0afacf0.png)
![](https://i-blog.csdnimg.cn/blog_migrate/03d7aced4af68f720138b9cddcf65a4a.png)
7、常用的PL/SQL日期函数
![](https://i-blog.csdnimg.cn/blog_migrate/0632914db30cf0f83930e99a24b9b569.png)
8、常用的PL/SQL转换函数
![](https://i-blog.csdnimg.cn/blog_migrate/4151ac375d8191508e34a7f139694a90.png)
![](https://i-blog.csdnimg.cn/blog_migrate/123f4404d9ce7667a27e871f07820d78.png)
9、常用的PL/SQL其他函数
![](https://i-blog.csdnimg.cn/blog_migrate/7aa9f52ccf1258f5493e1f0b5a800177.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4db3b4ea12e9ac4d7034862429b41be8.png)