PL/SQL(oracle)2_控制结构
控制结构
一、分支结构
1、if
?? 注意:elsif 和else If
if(条件)then ... ...elsif ... ...end if ;?2、case
用法:
?
CASE 语句
CASE selector WHEN value1 THEN action1; WHEN value2 THEN action2; WHEN value3 THEN action3; ….. ELSE actionN;END CASE;
CASE表达式
DECLARE temp VARCHAR2(10); v_num number;BEGIN v_num := &i; temp := CASE v_num WHEN 0 THEN 'Zero' WHEN 1 THEN 'One' WHEN 2 THEN 'Two' ELSE NULL END; dbms_output.put_line('v_num = '||temp);END;/
CASE搜索语句
CASE WHEN (boolean_condition1) THEN action1; WHEN (boolean_condition2) THEN action2; WHEN (boolean_condition3) THEN action3; …… ELSE actionN;END CASE;
CASE搜索表达式
DECLARE a number := 20; b number := -40; tmp varchar2(50);BEGIN tmp := CASE WHEN (a>b) THEN 'A is greater than B' WHEN (a<b) THEN 'A is less than B' ELSE 'A is equal to B' END; dbms_output.put_line(tmp);END;/
SELECT CASE WHEN 的用法
select 与 case结合使用最大的好处有两点,一是在显示查询结果时可以灵活的组织格式,二是有效避免了多次对同一个表或几个表的访问。下面举个简单的例子来说明。例如表 students(id, name ,birthday, sex, grade),要求按每个年级统计男生和女生的数量各是多少,统计结果的表头为,年级,男生数量,女生数量。如果不用select case when,为了将男女数量并列显示,统计起来非常麻烦,先确定年级信息,再根据年级取男生数和女生数,而且很容易出错。用select case when写法如下:
SELECT grade, COUNT (CASE WHEN sex = 1 THEN 1 /*sex 1为男生,2位女生*/ ELSE NULL END) 男生数, COUNT (CASE WHEN sex = 2 THEN 1 ELSE NULL END) 女生数 FROM students GROUP BY grade;
?
二、循环结构loop .... --用于退出循环 if(条件)then exit ; end if ; ....end loop ;2、有计数的循环(For循环)
DECLARE --在此处定义变量BEGIN FOR i IN 1..10 LOOP dbms_output.put_line(i) ; END LOOP ;END ;3、有条件的循环(while)?????????????????????????????????????????????????
DECLARE v_no NUMBER ;BEGIN v_no := 0 ; WHILE v_no<10 LOOP dbms_output.put_line(v_no) ; v_no := v_no+1 ; END LOOP ;END ;4、循环嵌套和标签??
declare type emp_record_type is Record ( v_empno emp.empno%type,v_ename emp.ename%type,v_sal emp.sal%type); --创建记录数据类型 emp_record emp_record_type;--创建记录型变量 begin select empno,ename,sal into emp_record from emp where empno = 7788;--为记录型变量赋值 dbms_output.put_line(emp_record.v_empno || emp_record.v_ename || emp_record.v_sal); --打印出记录型每一个分量 end;???? 练习:使用记录型变量显示在部门20中工资最低的员工姓名及部门名称。
Declare Type emp_record_type Is Record (v_ename emp.ename%Type,v_dname dept.dname%Type); emp_record emp_record_type; Begin Select ename,dname Into emp_record From emp ,dept Where emp.deptno = dept.deptno And emp.deptno = 20 And sal = (Select Min(sal) From emp Where deptno = 20); dbms_output.put_line(emp_record.v_ename || emp_record.v_dname); End; ???????????????????????????????? 记录类型的有效范围只在当前块中。
declare emp_record emp%Rowtype;--创建记录型变量 begin select * into emp_record from emp where empno = 7788;--为记录型变量赋值 dbms_output.put_line(emp_record.empno || emp_record.ename || emp_record.sal); --打印出记录型每一个分量 end;3、PL/SQL表??