首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

PL/SQL(oracle)二_控制结构

2013-11-22 
PL/SQL(oracle)2_控制结构控制结构一、分支结构1、if?? 注意:elsif 和else Ifif(条件)then... ...elsif... .

PL/SQL(oracle)2_控制结构
控制结构
一、分支结构
1、if
?? 注意:elsif 和else If

if(条件)then    ... ...elsif    ... ...end if ;?
2、case
?? 注意:
?? case语句中的条件选择器可以省略,when后面既可以是一个具体的值,也可以是一个或多个
?? 条件表达式。
?? case语句可以返回一个值,这是和java中的switch区别的。

用法:

?

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;

?

二、循环结构
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;    ??????????????????????????? 
????? 记录类型的有效范围只在当前块中。
2、一种简便创建记录型变量的方式:%rowtype,使用该属性不用事先声明记录类型了,%前面允许写表名、视图名、游标名。
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表??
???? 略。

热点排行