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