【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 变量或表达式
	when1 then 语句1
	[when2 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数学函数

6、常用的PL/SQL字符串函数

7、常用的PL/SQL日期函数

8、常用的PL/SQL转换函数

9、常用的PL/SQL其他函数

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱睡觉的小馨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值