|
第三章plsql 流程控制 |
|
|
流程控制语句PL/SQL的流程控制语句,包括如下三类:条件语句:if语句循环语句:loop语句,exit语句顺序语句:goto语句,null 语句一、条件语句方式一:if...then...endif;if...then...else...endif;if.. .then...elsif...else...endif;方式二:case...when...then...end;方式一1 .简单的条件判断if–then例:如果员工号为150号员工的工资低于2000,就给该雇员工资增加10%declarev_sa lemployees.sal%type;beginselectsalaryintov_salfromemployees whereemployee_id=150;ifv_sal<2000thenupdateemployeessetsa lary=salary+salary10%whereemployee_id=150;endif;end;2.二重条件分支 if—then--else例:如果员工号为150号员工的工资低于2000,就给该雇员工资增加10%高于2000.就给该雇员工资增 加5%declarev_salemployees.sal%type;beginselectsalaryintov_sal fromemployeeswhereemployee_id=150;ifv_sal<2000thenupdateem ployeessetsalary=salary+salary10%whereemployee_id=150;elsif v_sal>2000thenupdateemployeessetsalary=salary+salary5%wher eemployee_id=150;endif;end;3.多重条件分支if--then--elsif--else例:查询出 150号员工的工资,若其工资大于或等于10000则打印''salary>=10000'';若在5000到1000 0之间,则打印''5000<=salary<10000'';否则打印''salary<5000''(方法一)decla rev_salaryemployees.salary%type;beginselectsalaryintov_sala ryfromemployeeswhereemployee_id=150;dbms_output.put_line('' salary:''||v_salary);ifv_salary>=10000thendbms_output.pu t_line(''salary>=10000'');elsifv_salary>=5000thendbms_outpu t.put_line(''5000<=salary<10000'');elsedbms_output.put_line('' salary<5000'');endif;(方法二)declarev_salaryemployees.salary%ty pe;v_tempvarchar2(30);beginselectsalaryintov_salaryfrome mployeeswhereemployee_id=150;Ifv_salary>=10000thenv_temp :=''salary>=10000'';elsifv_salary>=5000)thenv_temp:=''5000< =salary<10000'';elsev_temp:=''salary<5000'';endif;dbms_o utput.put_line(v_salary||'',''||v_temp);end;方式二:case...when...t hen..else...end例:查询出150号员工的工资,若其工资大于或等于10000则打印''salary> =10000'';若在5000到10000之间,则打印''5000<=salary<10000'';否则打印'' salary<5000''declarev_salemployees.salary%type;v_tempvarchar 2(30);beginselectsalaryintov_salfromemployeeswhereemploy ee_id=150;v_temp:=casetrunc(v_sal/5000)when0then''salar y<5000''when1then''5000<=salary<10000''else''salary>=100 00''end;dbms_output.put_line(v_sal||'',''||v_temp);end;--case 不能向下面这样用(不能写范围)casev_salwhensalary>=10000thenv_temp:='' >=10000''whensalary>=5000thenv_temp:=''5000<=salary<100 00''elsev_temp:=''salary<5000''end;例:查询出122号员工的JOB_ID,若 其值为''IT_PROG'',则打印''A'';''AC_MGT'',打印''B'',''AC_ACCOUNT'',打印''C '';否则打印''D''declarev_job_idemployees.job_id%type;v_gradechar (10);beginselectjob_idintov_job_idfromemployeeswhereemplo yee_id=122;dbms_output.put_line(''job_id:''||v_job_id);v_gra de:=casev_job_idwhen''IT_PROG''then''A''when''AC_MGT''then ''B''when''AC_ACCOUNT''then''C''else''D''end;dbms_output.put_lin e(v_job_id||‘,’||v_grade);end;二.循环结构(三种)方式一:loop...exitwhe n...endloop;方式二:while...loop...endloop;方式三:foriin...loop...e ndloop;方式一:loop...exitwhen...endloop是pl/sql中最简单的循环语句,这种循环语 句以loop开头,以endloop结尾,这种循环至少会被执行一次.declare--初始化条件v_inumber(5) :=1;beginloop--循环体dbms_output.put_line(v_i);--循环条件(当这个条件结束)e xitwhenv_i=10;--迭代条件v_i:=v_i+1;endloop;end;例:现有一张users 表,createtableusers(usernonumber,usernamevarchar2(40));表结构如下用 户ID用户名编写一个过程,可输入用户名,并循环添加10个用户到users表中,用户编号从1开始增加declarev_numnu mber:=1beginloopinsertintousersvalues(v_num,spname);exit whenv_num=10;v_num:=v_num+1;endloop;end;方式二:WHILE...LOOP... ENDLOOP基本循环至少要执行循环体一次,而对于while循环来说,只有条件为true时,才会执行循环体语句,while循环 以while..loop开始,以endloop结束declare--初始化条件v_inumber(3):=1;beg in--循环条件whilev_i<=10loop--循环体dbms_output.put_line(v_i);- -迭代条件v_i:=v_i+1;endloop;end;案例:现有一张表users,表结构如下用户ID用户名例:编 写一个过程,可输入用户名,并循环添加10个用户到users表中,用户编号从11开始增加.createproceduresp_p ro6(spnamevarchar2)isv_numnumber:=1beginWhilev_num<=20loopi nsertintousersvalues(v_num,spname);v_num:=v_num+1;endloop;en d;方式三:for循环for循环计数器IN(reverse)下限..上限loop要执行的语句;Endloop;每循环一次,循 环变量自动加1,使用关键字reverse,循环变量自动减1。跟在inreverse后面的数字必须是从小到大的顺序,而且必须是整数 ,不能是变量或表达式。可以使用Exit退出循环。例:beginforiin(reverse)1..10loopdbms_c upput.put_line(i);endloop;end;三.顺序控制语句-goto,null①goto语句goto语句用于 跳转到特定标号去执行语句.注意由于使用goto语句会增加程序的复杂性,并使得应用程序可以读性变差,所以在做一般应用开发时,建议大家 不要使用goto语句.基本语法如下gotolable,其中lable是已经定义好的标号名,declareiint:=1;b eginloopdbms_output.put_line(‘输出i=‘||i);ifi=10thengotoend_loop ;endif;i:=i+1;endloop;<>dbms_output.put_line(''循环结束''); end;■顺序控制语句-goto,null②nullnull语句不会执行任何操作,并且会直接将控制传递到下一条语句。使用null语句的主要好处是可以提高pl/sql的可读性,,declarev_salemp.sal%type;v_enameemp.ename%type;beginselectename,salintov_ename,v_salfromempwhereempno=&no;ifv_sal<3000thenupdateempsetcomm=sal0.1whereename=v_ename;elsenull;endif;end; |
|
|
|
|
|
|
|
|
|
|