注:

以下测试案例所用的表均来自与scott方案,使用前,请确保该用户解锁.

1、简介

和大多数编程语言一样,在编写PL/SQL程序时,可以定义常量和变量,在pl/sql程序中包括有:

a、标量类型(Scalar)

b、复合类型(Composite)

c、参照类型(Refrence)

d、lob(large object)类型

下面来一一介绍

2、标量(Scalar)类型       只能存放单个值的变量

在编写pl/sql语句时,如果需要用到变量,那么就需要在定义部分定义变量。pl/sql中定义变量个常量的语法如下:

identifier [constant] datatype [not null] [:=| default expr]

identifier:名称

constant:指定常量,需要指定它的初始值,且其值是不能改变的

datatype:数据类型

not null:指定变量值不能为空

:=给变量或者常量指定初始值

defalut:用于指定初试值

expr:指定初始值的pl/sql表达式,可是文本值、其他变量或者函数

2.1、标量定义的案例

定义一个变长字符串

v_name varchar2(10);

定义一个小数  范围   -9999.99~9999.99

v_sal number(6,2)

定义一个小数,并给定初始值6.6  注:     :=是pl/sql的变量赋值号

v_num number(6.2):=6.6

定义一个日期类型的数据

v_date date;

定一个布尔变量,不能为空,初始值为false;

v_bool boolean not null defalut false;

注:pl/sql中使用标量并给其赋初值的方式不同于其他的编程语言,需要在等号前加":"

2.2、标量使用的案例

作用:变量是存放pl/sql块中最普通的变量

输入一个员工号,显示雇员的姓名、工资、个人所得税(税率为0.03),代码如下:

  1. declare
  2. c_tax_rate number(3,2):=0.03;
  3. v_name varchar2(5);
  4. v_sal number(7,2);
  5. v_tax_sal number(7,2);
  6. begin
  7. select ename,sal into v_name,v_sal from emp where empno=&no;
  8. v_tax_sal:=v_sal * c_tax_rate;
  9. dbms_output.put_line('姓名是:'||v_name||'工资:'||v_sal||'交税:'||v_tax_sal);
  10. end;

ok,输出成功!

但是上面的代码存在漏洞

我们给变量指定了定长,但是如果我们输入的编号对应的ename的长度大于5,就像下面这样:

我输入了7654,这时对应的ename的长度大于5,所以程序包错了

所以必须解决这个问题,当我们不知道变量长度的时候,让其长度和对应的表字段匹配,从而使程序不抱错,解决方案参考2.3

2.3、标量中使用%type

  1. declare
  2. c_tax_rate number(3,2):=0.03;
  3. v_name emp.ename%type;
  4. v_sal emp.sal%type;
  5. v_tax_sal emp.sal%type;
  6. begin
  7. select ename,sal into v_name,v_sal from emp where empno=&no;
  8. v_tax_sal:=v_sal * c_tax_rate;
  9. dbms_output.put_line('姓名是:'||v_name||'工资:'||v_sal||'交税:'||v_tax_sal);
  10. end;

ok,再次输入7654,正常输出。

3、复合变量(composite)   用于存放多个值的变量

3.1、复合类型-pl/sql记录

类似高级语言中的结构体,需要注意的是,当引用pl/sql记录中的成员时,必须要加记录变量作为前缀(记录变量.记录成员),如果定义一个pl/sql记录类型呢?代码如下:

  1. declare
  2. type emp_record_type is record(
  3. name emp.ename%type,
  4. salary emp.sal%type
  5. );

这样就定义了一个名为emp_record_type的复杂变量类型,那么如何使用这个类型呢?代码如下:

  1. sp_record emp_record_type;

ok,这样就定义了一个emp_record_type类型的变量,名为sp_record;

  1. declare
  2. type emp_record_type is record(
  3. name emp.ename%type,
  4. salary emp.sal%type
  5. );
  6. sp_record emp_record_type;
  7. begin
  8. select ename,sal into sp_record from emp where empno=7788;
  9. dbms_output.put_line('员工名:'|| sp_record.name||'工资:'||sp_record.salary);
  10. end;

ok,使用复合类型-pl/sql记录成功的输出了员工名和工资

3.2、复合类型-pl/sql表

这种类型相当于高级语言的数组,但需要注意的是高级语言中的数组下标不能为负数,而pl/sql可以是可以为负数,而且表元素的下标没有限制。如何定义一个pl/sql表类型呢?代码如下:

  1. declare
  2. type sp_table_type is table of emp.ename%type index by binary_integer;

ok,上面的代码定义了一个类型为emp.ename的pl/sql表类型,也可以理解为类型为emp.ename的数组,那么如何使用这个类型,代码如下:

  1. sp_table sp_table_type

ok,这样就定义了一个emp_table_type类型的变量,名为sp_table;

  1. declare
  2. type sp_table_type is table of emp.ename%type index by binary_integer;
  3. sp_table sp_table_type;
  4. begin
  5. select ename into sp_table(0) from emp where emp.empno=7788;
  6. dbms_output.put_line('姓名是:'||sp_table(0));
  7. end;

ok,上面的代码将empno为7788的员工姓名放入了sp_table中,并指定其下标为0,所以我们在下面输出时,指定输出sp_table(0),所以正常输出,

下面是使用pl/sql表类型经常出错的地方:

i、但是当我们指定存放的下标为-1,而输出的下标为0时,代码就会报错,具体的代码如下:

  1. declare
  2. type sp_table_type is table of emp.ename%type index by binary_integer;
  3. sp_table sp_table_type;
  4. begin
  5. select ename into sp_table(-1) from emp where emp.empno=7788;
  6. dbms_output.put_line('姓名是:'||sp_table(0));
  7. end;

所以当我们使用pl/sql表类型时,需要注意下标的对应

ii、当查询返回的结果集是多个,但是又指定pl/sql表类型的下标,相当于pl/sql表类型只接受一个值,这个时候会报错,具体代码如下:

  1. declare
  2. type sp_table_type is table of emp.ename%type index by binary_integer;
  3. sp_table sp_table_type;
  4. begin
  5. select ename into sp_table(-1) from emp;
  6. dbms_output.put_line('姓名是:'||sp_table(-1));
  7. end;

select ename from emp,返回了多个结果,而into sp_table(-1)只接受一个值,所以报上面的错误了。

4、参照变量

参照变量是指用于存放数值指针的变量,通过使用参照变量,可以使应用程序共享相同对象,从而降低占用的空间。在编写pl/sql程序时,可以使用游标变量(ref cursor)和对象类型变量

(ref obj_type)两种参照变量类型。

4.1、参照变量-ref cursor游标变量

使用游标时,当定义游标时,不需要指定相应的select 语句,但是当使用游标时,就需要指定select语句,这样一个游标就和一个selec语句结合了.下面是游标的案例

a、请使用pl/sql编写一个块,可以输入部门号,显示该部门下所有员工的姓名和工资,代码如下:

首先定义一个游标类型:

  1. type sp_emp_cursor is ref cursor;

接着定义一个sp_emp_cursor游标类型的游标变量

  1. test_cursor sp_emp_cursor;

然后打开游标,将游标与结果集结合

  1. open test_cursor for select ename,sal from emp where empno=&no;

ok,现在test_cursor指向了select ename,sal from emp where empno=&no   结果集

然后循环游标,取出我们想要的数据,然后赋值给定义好的标量,并输出给标量,循环完毕(游标使用完毕),关闭游标,代码如下:

  1. declare
  2. type sp_emp_cursor is ref cursor;--定义一个游标类型
  3. test_cursor sp_emp_cursor;--定义一个游标变量
  4. v_ename emp.ename%type;
  5. v_sal emp.sal%type;
  6. begin
  7. --执行
  8. --把test_cursor和一个select结合
  9. open test_cursor for select ename,sal from emp where deptno=&no;
  10. --循环取出
  11. loop
  12. fetch test_cursor into v_ename,v_sal;
  13. --判断test_cursor是否循环到空数据,如果循环到空数据,那么就停止循环
  14. exit when test_cursor%notfound;
  15. dbms_output.put_line('姓名:'||v_ename||'工资:'||v_sal);
  16. end loop;
  17.  
  18. --使用完毕关闭游标
  19. close test_cursor;
  20. end;

ok,完成a需求。

b、在a的基础上,如果某个员工的工资低于200元,就增加100元。使用游标完成需求。

Oracle PL/SQL编程之变量的更多相关文章

  1. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  2. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

    原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...

  3. ORACLE PL/SQL编程之八:把触发器说透

    原文:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之八: 把触发器说透 大家一定要评论呀,感谢!光发表就花了我将近一个下午. 本篇主要内容如下: 8.1 触发器类型 ...

  4. [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)

    原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/S ...

  5. ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)

    原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!)   继上篇:ORACLE P ...

  6. [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)

    原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ...

  7. [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)

    原文:[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之四: 把游标说透(不怕做不到,只怕想不到) 继上两篇:ORACLE PL ...

  8. 【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航

    原文:[强烈强烈推荐]<ORACLE PL/SQL编程详解>全原创(共八篇)--系列文章导航 <ORACLE PL/SQL编程详解> 系列文章目录导航 ——通过知识共享树立个人 ...

  9. [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

    原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日 ...

随机推荐

  1. CALayer, CoreGraphics与CABasicAnimation介绍

    今天我们来看一下CALayer.CoreGraphics和CABasicAnimation.这些东西在处理界面绘制.动画效果上非常有用. 本篇博文就讲介绍CALayer的基本概念,使用CoreGrap ...

  2. 浅谈https\ssl\数字证书

    全球可信的SSL数字证书申请:http://www.shuzizhengshu.com 在互联网安全通信方式上,目前用的最多的就是https配合ssl和数字证书来保证传输和认证安全了.本文追本溯源围绕 ...

  3. hadoop大致问题

    一.项目编码实现 HDFS文件上传 HDFS文件下载 定位文件读取 通过API操作HDFS 通过IO流操作HDFS HDFS写数据流程 HDFS读数据流程 统计一堆文件中单词出现的个数(WordCou ...

  4. 【微服务架构】SpringCloud之Feign(五)

    Feign简介 Feign 是一个声明web服务客户端,这便得编写web服务客户端更容易,使用Feign 创建一个接口并对它进行注解,它具有可插拔的注解支持包括Feign注解与JAX-RS注解,Fei ...

  5. 搭建IntelliJ IDEA授权服务

    废话不多,直接开始 下载IntelliJ IDEA授权服务软件v1.4 密码:mu3t 下载IntelliJ IDEA授权服务软件v1.3 密码:1odn 选择你自己服务器的版本,我这里选择Intel ...

  6. 强大的CSS 属性选择符 配合 stylish 屏蔽新浪微博信息流广告

    新建一条微博域名下的规则: @-moz-document domain("weibo.com") { #v6_pl_rightmod_rank,#v6_pl_rightmod_ad ...

  7. RobotFramework与Jenkins集成后失败用例重跑

    Jenkins的执行Windows批处理命令填写如下: call pybot.bat -i 1adsInterface 01_测试用例\接口测试用例\adsInterface.txt call pyb ...

  8. 群晖Synology

    简介 群晖是做的最好的一家NAS公司,声称是买软件卖硬件,软件有丰富的功能. 白群晖就是指从正规渠道买软件+硬件,价格昂贵,性价比低. 黑群晖是指自己搭建或购买单独的硬件(可以是电脑主机.可以是其他厂 ...

  9. jquery 全选反选 .prop('checked',!$(this).is(':checked'));

    //废话不说直接上代码 $("#").click(function(){ $("#content-div label input[type='checkbox']&quo ...

  10. 解决:The APR based Apache Tomcat Native library which allows optimal performance in production...

    tomcat日志apr报错引发的基于Tomcat Native加速Tomcat性能 tomact服务启动报错日志如下:息: The APR based Apache Tomcat Native lib ...