设为首页 收藏本站
查看: 721|回复: 0

[经验分享] PL/SQL(oracle)2_控制结构

[复制链接]

尚未签到

发表于 2016-8-3 12:18:41 | 显示全部楼层 |阅读模式
控制结构

一、分支结构

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表  

     略。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-252326-1-1.html 上篇帖子: Oracle集合数据类型的比较 下篇帖子: PL/SQL(oracle)6_存储过程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表