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('早就执行');这个地方,标签上一行输出语句将不会输出