Oracle PL/SQL编程之变量_weixin_33928137的博客-程序员ITS203

技术标签: 数据库  

注:

以下测试案例所用的表均来自与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),代码如下:

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

ok,输出成功!

但是上面的代码存在漏洞

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

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

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

 

2.3、标量中使用%type

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

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

 

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

 

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

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

declare
type emp_record_type is record(
name emp.ename%type,
salary emp.sal%type
);

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

sp_record emp_record_type;

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

declare
type emp_record_type is record(
name emp.ename%type,
salary emp.sal%type
);
sp_record emp_record_type;
begin
select ename,sal into sp_record from emp where empno=7788;
dbms_output.put_line('员工名:'|| sp_record.name||'工资:'||sp_record.salary);
end;

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

 

3.2、复合类型-pl/sql表

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

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

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

sp_table sp_table_type

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

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

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

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

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

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

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

 

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

declare
type sp_table_type is table of emp.ename%type index by binary_integer;
sp_table sp_table_type;
begin
  select ename into sp_table(-1) from emp;
  dbms_output.put_line('姓名是:'||sp_table(-1));
  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编写一个块,可以输入部门号,显示该部门下所有员工的姓名和工资,代码如下:

首先定义一个游标类型:

type sp_emp_cursor is ref cursor;

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

test_cursor sp_emp_cursor;

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

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

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

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

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

ok,完成a需求。

 

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

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33928137/article/details/85873202

智能推荐

嵌入式系统设计师_Destihang的博客-程序员ITS203

这两个月来,因为公司项目比较多,所以工作量也比较大,学习的时间比较少。但是从工作中还是学到了不少,特别是cpu编译器相关方面的东西。打算下半年考一个中级软件工程师的证书,就把这段时间需要注意的东西纪录下来。CPU是计算机的控制中心,主要由计算器,控制器,寄存器组和内部总线等部件组成。控制器由程序计数器,指令寄存器,指令译码器,时序产生器和操作控制器组成。程序计数器是专用寄存器,具有寄存

vue.jsv-html,关于vue.js v-bind 的一些理解和思考,vue.jsv-bind_卓娅zoya的博客-程序员ITS203

关于vue.js v-bind 的一些理解和思考,vue.jsv-bind一、v-bind 初探它是一个 vue 指令,用于绑定 html 属性,如下:html属性不能使用双大括号形式绑定,只能使用v-bind指令......var vm = new Vue({el: '#app',data: {title: 'title content'}});这里的 html 最后会渲染成:html属性不能使...

R 语言统计基础_Wolverin3的博客-程序员ITS203_r统计语言

R 语言统计基础一、使用R语言解各种分布,如标准正态分布,泊松分布,均匀分布二、统计量> ns <- rpois(10000, 1)> table(ns)> ns> 0 1 2 3 4 5 6 7 > 3652 3757 1831 580 145 26 8 1 > mean...

电脑adb驱动安装成功但识别不了adb设备_frank_zyp的博客-程序员ITS203_设备管理器上找不到adb

设备管理器里面Android Composite ADB Interface,但ADB无法连接问题解决,但通过豌豆荚可以连接adb

springboot-jpa环境搭建与应用-----springboot-jpa分享(一)_森森之火的博客-程序员ITS203

springboot集成jpa,对快速开发项目很有帮助源码地址:https://gitee.com/xing_xin/springboot-jpa.git本章节主要讲一些简单用法,如单表的增删改查本项目采用springboot2.0.0.RELEASE一、项目搭建 建立项目,结构如下注:entity包里放与表对应的实体,repository包里放jp...

css折扣样式_ansinie的博客-程序员ITS203_css折扣

<style type="text/css"> #Discount{ border: 1px solid red; width: 200px; height: 50px; text-align: center; font-size: 20px; line-height: 50px; } #Discount>div{ float: left; } #Discount>#left{ ba

随便推点

史上最强Android木马”现身_beijingshi1的博客-程序员ITS203

最近有媒体爆料,最高级的Android木马已经现身,据称“它能利用Android操作系统此前未知的漏洞提升程序权限,并能阻止被卸载。”该恶意程序被称为“Backdoor.AndroidOS.Obad.a”,其恶意行为是通过悄悄向增值服务号码发送短信获利。利用Android未曾发现漏洞并且无法卸载,“史上最强Android木马”有多神奇?就此,360手机安全专家为我们做了深度剖析,详解攻破“最强木马

docker java环境变量_SpringBoot+docker环境变量配置详解_阿内本人的博客-程序员ITS203

项目中遇到springBoot+docker需要配置不同环境变量的问题,做个简单的总结:1.开发环境ide中启动项目可以通过ide的环境变量参数配置,启动之后使用哪个配置,比如这样就使用application-test.yml中的配置2.通过gradle打包可以通过-P参数来指定打包后的jar使用哪种环境来运行,比如gradlew -Pprod bootWar打包之后运行会使用prod中的配置;我...

vue中引入mxGraph_sinat_32720011的博客-程序员ITS203

第一步:下载npm包npm install mxgraph --save第二步:新建一个index.js文件文件内容如下import mx from 'mxgraph';const mxgraph = mx({ mxImageBasePath: './src/images', mxBasePath: './src'});// decode bug https://githu...

Ubuntu中安装mujoco-py及使用学生邮箱注册激活_Farm_Coder的博客-程序员ITS203

目录Ubuntu中安装mujoco-py及使用学生邮箱注册激活安装过程下载与安装MuJoCo利用学生邮箱激活安装mujoco-py安装过程中可能遇到的问题Ubuntu中安装mujoco-py及使用学生邮箱注册激活本文记录了在Ubuntu16.04下安装Mujoco-py全过程,内容参考open ai的github官网安装过程下载与安装MuJoCo下载MuJoCo,Linux: h...

OceanBase_weixin_39250603的博客-程序员ITS203

https://baike.baidu.com/item/OceanBase/3041032?fr=aladdin

推荐文章

热门文章

相关标签