PL/SQL的流程控制

PL/SQL也是一门高级语言,所以流程控制是必须要有的,oracle数据库的pl/sql比sqlserver数据库要难,很多pl/sql中有的sqlserver里面没有

流程控制;

   分支语句 if 条件 then 结果 else 结果  end if ;

  条件语句 case    when   条件  then  结果;

   循环语句  loop      end loop;    --while循环; for循环

   顺序语句 goto

   null语句

下面所有的语句有的写在过程中的有的写在pl/sql块中,pl/sql块中是最方便的

----------------分支语句

------------------------------简单的条件判断 if – then

 --问题:编写一个过程,可以输入一个雇员名,
--如果该雇员的工资低于2000,就给该员工工资增加500。

set serveroutput on;--打开输入输出

create or replace procedure pro_1(v_empno number) is
 v_sal emp.sal%type;
begin

   select sal into v_sal from emp where  empno = v_empno;
if v_sal<2000 then
  v_sal:=v_sal+500;
 --更新这个员工的工资
  
   update emp set sal=v_sal where empno=v_empno;
end if;
end;

 -----------------二重条件分支 if – then – else

 --问题:编写一个过程,可以输入一个雇员名,
--如果该雇员的工资低于2000,就给该员工工资增加500,否则只加50。

set serveroutput on;--打开输入输出

create or replace procedure pro_1(v_empno number) is
 v_sal emp.sal%type;
begin

   select sal into v_sal from emp where  empno = v_empno;
if v_sal<2000 then
  v_sal:=v_sal+500;
else
 v_sal:=v_sal+50;
end if;
 --更新这个员工的工资
     update emp set sal=v_sal where empno=v_empno;

end;

---------------------多重条件  if then  else if then else
--问题:编写一个过程,
--可以输入一个雇员编号,
--如果该雇员的职位是PRESIDENT就给他的工资增加500,
--如果该雇员的职位是MANAGER就给他的工资增加100,
--其它职位的雇员工资增加50。

create or replace procedure pro_2(v_empno number) is
v_job emp.job%type;
v_sal emp.sal%type;
begin
  select job,sal into v_job,v_sal from emp where empno =v_empno;

  if v_job='PRESIDENT' then
     v_sal:=v_sal+500;
   else if v_job='MANAGER' then
       v_sal:=v_sal+100;
   else
     v_sal:=v_sal+50;
  end if;
 end if;
 --更新数据
  update emp set sal=v_sal where empno=v_empno;

end;

------------------------case语句


--case 条件控制
--问题:编写一个过程,
--可以输入一个雇员编号,
--如果该雇员的职位是PRESIDENT就给他的工资增加50,
--如果该雇员的职位是MANAGER就给他的工资增加40,
--CLERK 30

create or replace procedure pro_4(v_empno number) is
--声明变量
v_job emp.job%type;
v_sal emp.sal%type;
begin
      select job,sal into v_job,v_sal from emp where empno =v_empno;
case v_job
  when v_job='PRESIDENT' then
   v_sal:=v_sal+50; 
  when v_job='MANAGER' then
    v_sal:= v_sal+40;
  when  v_sal ='CLERK' then
    v_sal:=v_sal+30;
   else
   null;--
end case;
--更新数据
  update emp set sal=v_sal where empno=v_empno;

end;

 ----------------------------循环语句

loop循环;

--Loop  相当于java中的do...while
--请编写一个过程,可以输入用户名,
--并循环添加10个用户到emp_user表中,用户编号从1开始增加。

建表;

create table emp_user (userno number(10),username varchar2(10));

 向emp_user表中循环添加10条数据

create or replace procedure pro_3(v_username varchar2)is
v_userid emp_user.userid%type :=1;
begin
--循环
loop
insert into emp_user values(v_userno,v_username);
--v_userid++
v_userid=v_userid+1;
--退出循环
exit when v_userid=11;
end loop;
end;

-----------------------------while循环
--问题:请编写一个过程,
--可以输入用户名,并循环添加10个用户到users表中,
--用户编号从11开始增加。

建表;

create table emp_user (userno number(10),username varchar2(10));

使用while向表中添加数据

create or replace procedure pro_4(v_userno number )is
v_userid emp_user.userid%type :=1;
begin
while v_userid<10 loop
insert into emp_user values(v_userid,v_username);
--v_userid++
v_userid=v_userid+1;

 end loop
end;

--------------------------for  语句

--for循环
--for i in 1..10 loop
--for i in reverse 1..10 loop

建表;

create table emp_user (userno number(10),username varchar2(10));

使用for向表中添加十条数据

create or replace procedure pro_5(v_userno number)is
begin
  for i in 1..10 loop
insert into emp_user values(i,v_username);
end loop;
end;

-----------goto语句

goto语句可以跳转到程序的任何位置,java中已经不用这个关键字了,但是还保留着

createor replace procedure pro_5(v_userno number) is
 i number(20):=1;

begin
  loop
 i:=i+1;
if i=10 then
goto  aaa;
 end if;
end loop;

   dbms_output.put_line('程序执行');
    <<aaa>>;--设置goto的跳转标签
   dbms_output.put_line('早就执行');
end;

当i=10时程序将条状到   <<aaa>>;--设置goto的跳转标签 dbms_output.put_line('早就执行');这个地方,标签上一行输出语句将不会输出

猜你喜欢

转载自baihe747.iteye.com/blog/2145997
今日推荐