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;
二、循环结构
1、基本循环:无条件的循环
语法:
Loop
循环体;
End Loop;
注意:循环体中不要忘记添加退出循环的语句。使用exit 关键字进行循环的退出
loop
....
--用于退出循环
if(条件)then
exit ;
end if ;
....
end loop ;
2、有计数的循环(For循环)
语法:
For 计数器 In [Reverse] 循环下限..循环上限 Loop
循环体;
End Loop;
注意:计数器是一个不需要事先声明的整型变量,每次循环之后自动增1或者减1。
DECLARE
--在此处定义变量
BEGIN
FOR i IN 1..10 LOOP
dbms_output.put_line(i) ;
END LOOP ;
END ;
3、有条件的循环(while)
语法:
While 条件 Loop
循环体;
End Loop;
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、循环嵌套和标签
复合数据类型
一、复合数据类型的概念
内部可以再有分量的数据类型叫做复合数据类型。此种数据类型不是Oracle自动提供的。
二、复合变量
和创建不同的变量形式相同。
变量名 数据类型名;
三、复合数据类型种类
1、记录型
记录数据类型相当于类,该类型里面的分量名相当于属性名
记录型变量相当于类的一个实例(对象)
语法:
a、创建数据类型
在decalre部分使用如下语法:
Type 记录型名字 Is Record (分量名列表);
其中分量名列表格式为:变量名 数据类型 [Not Null][Default][初始值]
b、创建该类型的变量
在declare部分使用如下语法:
变量名 记录型名字
c、记录型变量的引用。
如果想引用变量中的某一个分量,可以直接写 变量名.分量名
如果想引用整个变量,就直接写变量名
当使用Select为记录型变量赋值时,要注意Select后面的列名列表一定要和into后面的记录型
变量中的分量列表在个数和数据类型上保持一致。
案例:
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;
记录类型的有效范围只在当前块中。