天天看點

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('早就執行');這個地方,标簽上一行輸出語句将不會輸出