n  介绍

在编写pl/sql程序是,可以定义变量和常量;在pl/sql程序中包括有:

①标量类型(scalar)

②复合类型(composite)

③参照类型(reference)

④lob(large object)

标量(scalar)一常用类型

在编写pl/sql块时,如果要使用变量,需在定义部分定义变量。

n  pl/sql中定义变量和常量的语法如下:

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

identifier:名称

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

datatype:数据类型

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

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

default:用于指定初始值

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

n  标量定义的案例

①定义一个变长字符串

v_ename varchar2(10)

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

v_sal number(6,2);

③定义一个小数并给一个初始值为5.4:=是pl/sql的赋值号

v_sal2number(6,2):=5.4

④定义一个日期类型的数据

v_hiredate date;

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

v_valid boolean:=false;

标量(scalar)一使用标量

在定义好变量后,就可以使用这些变量。这里需要说明的是pl/sql块为变量赋值不同于其它编程语言,需要在等号前加冒号(:=)

案例:以输入工号,显示雇员姓名、工资、个人所得税(税率为0.03)为例,说明变量的使用,看看如何编写。

create or replace procedure pro1(v_in_empno in number) is

v_tax_rate number(3,2):=0.03;

v_sal number;

v_ename varchar2(32);

v_tax number;

begin

select ename,sal into v_ename,v_sal from emp where empno=v_in_empno;

v_tax:=v_sal*v_tax_rate;

dbms_output.put_line(v_ename||'工资是 '||v_sal||'  个人所得税是 '||v_tax);

end;

标量(scalar)一使用%type类型

对于上面的pl/sql块有一个问题:

就是如果员工的姓名超过了5个字符的话,就会有错误,为了降低pl/sql程序的维护工作量,可以使用%type属性定义变量,这样它会按照数据库列来确定你定义的变量的类型和长度。

为了让我们在pl/sql编程中,让变量的类型和大小与表的列的大小和类型一致可以使用%type。

我们看看这个怎么使用:

标识符名  表名.列名%type;

create or replace procedure pro1(v_in_empno in number) is

v_tax_rate number(3,2):=0.03;

v_sal emp.sal%type;    --为了让V_sal的类型更加灵活,使用%type自适应

v_ename emp.ename%type;

v_tax number;

begin

select ename,sal into v_ename,v_sal from emp where empno=v_in_empno;

v_tax:=v_sal*v_tax_rate;

dbms_output.put_line(v_ename||'工资是 '||v_sal||'  个人所得税是 '||v_tax);

end;

复合变量(composite

用于存放多个值的变量。常用的包括这:

①pl/sql记录     ②pl/sql表

复合类型一pl/sql记录

类似与高级语言中的结构体,需要注意的是,当引用pl/sql记录成员时,必须要加记录变量作为前缀(记录变量.记录成员)如下:

 
 

type 自己定义的记录名称 is record(

变量 变量类型,

变量 变量类型,

);

//使用自定义的pl/sql记录

变量名 自己定义的pl/sql记录名;

请编写一个过程,该过程可以接收一个用户编号,并显示该用户的名字、薪水、工资岗位(注意:要求用pl/sql记录实现)

create or replace procedure
pro1(v_in_empno in number) is

type lsz_emp_record is
record(

v_ename emp.ename%type,

v_sal emp.sal%type,

v_job emp.job%type);

v_emp_record lsz_emp_record;

begin

select ename,sal,job into v_emp_record from
emp where empno=v_in_empno;

dbms_output.put_line('名字:'||v_emp_record.v_ename||'
工资:'||v_emp_record.v_sal);

end;

复合类型一pl/sql表(了解即可)

类似与高级语言中的数组,但是需要注意的是在高级语言中数组的下标不能为负数,而pl/sql是可以为负数的,并且表元素的下标没有限制,实例如下:

declare

type sp_table_type is
table of emp.ename%type

index by binary_integer;

sp_table
sp_table_type;          --定义一个变量:sp_table:类型

begin

select
ename into sp_table(-1) from emp where empno=7788;

dbms_output.put_line(‘员工名:’||sp_table(-1));

end;

说明:
sp_table_type       是pl/sql表类型

emp.ename%type   指定了表的元素的类型和长度

sp_table            为pl/sql表变量

sp_table(0)          则表示下标为0的元素

参照变量一介绍

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

参照变量-ref
cursor
使用

               
 

定义游标:

type自定义游标名 is ref cursor;

变量名 自定义游标名;

   

打开游标:

open 游标变量 for select 语句;

 
 
   

取出当前游标指向的行:

fetch 游标变量 into 其它变量;

     

判断游标是否指向记录最后:

游标变量%notfound

 

 

 

 

 

 

 

 

 

 

通过游标,我们可以取得返回结果集(这个结果集,往往是select语句的结果)的任何一行数据,从而提高共享的效率

 

使用游标:当定义游标时不需要指定相应的select语句,但是当使用游标时(open)需要指定select语句,这样一个游标就与一个select语句结合了。实例如下:

①请使用pl/sql编写一个过程,可以输入部门号,并显示该部门所有员工姓名和他的工资。

create
or
replace
procedure
pro1(v_in_deptno
number)
is

--先定义一个游标变量类型

type
lsz_emp_cursor is
ref
cursor;

--定义一个游标变量

v_emp_cursor
lsz_emp_cursor;

--定义两个变量

v_ename
emp.ename%type;

v_sal
emp.sal%type;

begin

--执行语句

open
v_emp_cursor for
select
ename,sal
from
emp where
deptno=v_in_deptno;

--取出游标指向的每行数据,用循环语句

loop

fetch
v_emp_cursor into
v_ename,v_sal;--这句话会引起v_emp_cursor向下走一格

--判断当前游标是否到达最后

exit
when
v_emp_cursor%notfound;

--输出

dbms_output.put_line('用户名:'||v_ename||'  薪水:'||v_sal);

end
loop;

--关闭游标(完成后一定要记住关闭游标)

close
v_emp_cursor;

end;

②在①的基础上,如果某个员工的工资低于200元,就增加100元。

create
or
replace
procedure
pro1(v_in_deptno
number)
is

--先定义一个游标变量类型

type
lsz_emp_cursor is
ref
cursor;

--定义一个游标变量

v_emp_cursor
lsz_emp_cursor;

--定义两个变量

v_ename
emp.ename%type;

v_sal
emp.sal%type;

v_empno
emp.empno%type;

begin

--执行语句

open
v_emp_cursor for
select
ename,sal,empno
from
emp where
deptno=v_in_deptno;

--取出游标指向的每行数据,用循环语句

loop

fetch
v_emp_cursor into
v_ename,v_sal,v_empno;--这句话会引起v_emp_cursor向下走一格

--判断当前游标是否到达最后

exit
when
v_emp_cursor%notfound;

--输出

--dbms_output.put_line('用户名:'||v_ename||'  薪水:'||v_sal);

if
v_sal<1500
then

update
emp set
sal=sal+100
where
empno=v_empno;

end
if;

end
loop;

--关闭游标(完成后一定要记住关闭游标)

close
v_emp_cursor;

end;

pl/sql基础知识—定义并使用变量的更多相关文章

  1. PL/SQL基础知识

    Oracle之PL/SQL学习笔记 自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了 ...

  2. pl/sql基础知识—过程快速入门

    n  过程 过程用于执行特定的操作,当建立过程时,既可以指定输入参数(in),也可以指定输出参数(out),通过在过程中使用输入参数,可以将数据传递到执行部分:通过使用输出参数可以将执行部分的数据传递 ...

  3. pl/sql基础知识—pl/sql块介绍

    n  介绍 块(block)是pl/sql的基本成型单元,编写pl/sql程序实际上就是编写pl/sql块.要完成相对简单的应用功能,可能只需要编写一个pl/sql块:但是如果要想实现复杂的功能,可能 ...

  4. PL/SQL 基础知识简介

    1.PL/SQL代码块 PL/SQL 代码块是指令的集合,支持所有的DML,NDS,DBMS_SQL,DDL. :DML 是数据操纵语言(Data Manipulation Language)包括,I ...

  5. 【PL/SQL基础知识】结构

    1.pl/sql块的结构 declare --声明的变量.类型.游标 begin --程序的执行部分(类似于java的main()方法) exception --针对begin块中出现的异常 ---w ...

  6. pl/sql基础知识—触发器

    n  触发器简单介绍 触发器是指隐含执行的存储过程,它不是由程序员或者是DBA来显式调用,而是因为某个操作引发执行的.当定义触发器时,必须要指定触法的事件和触发的操作,常用的触发事件包括insert, ...

  7. pl/sql基础知识—包

    n  包 包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成. 为什么需要包:使用包可以更好的管理自己写的函数.过程 ①我们可以使用create package命令来创建包:     creat ...

  8. pl/sql基础知识—函数快速入门

    n  函数 函数用于返回特定的数据,当建立函数式,在函数头部必须包含return子句,而在函数体内必须包含return语句返回的数据,我们可以使用create function来建立函数,实际案例: ...

  9. [SQL] SQL 基础知识梳理(一)- 数据库与 SQL

    SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...

随机推荐

  1. spring cloud深入学习(八)-----配置中心svn示例和refresh

    svn版本 同样先示例server端的代码,基本步骤一样. 1.添加依赖 <dependencies> <dependency> <groupId>org.spri ...

  2. PAT甲级——A1012 The Best Rank

    To evaluate the performance of our first year CS majored students, we consider their grades of three ...

  3. python 当文件目录不存在时,如何自动创建

    import os if not os.path.exists('foldername'): os.mkdir('foldername')

  4. spring定时任务scheduler集群环境下指定运行服务器防止多服务器多次执行

    使用spring的@Scheduler注解可以非常方便的启动一个定时任务,但是当服务部署在多台服务器上做负载均衡的时候,可能会出现重复执行的情况. 现在我们通过代码指定job只在某一台机器执行. 首先 ...

  5. chgrp权限命令

    功能说明:变更文件或目录的所属群组. 语 法:chgrp [-cfhRv][--help][--version][所属群组][文件或目录...] 或 chgrp [-cfhRv][--help][-- ...

  6. Leetcode561.Array Partition I数组拆分1

    给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大. 示例 ...

  7. C++/CLI 创建WPF程序

    本文简单演示下用C++/CLI创建WPF程序,IDE为VS2015 首先创建CLR项目,选择CLR空项目: 然后,右键源文件,选择新建class,选择CLR->Component Class 接 ...

  8. vue跨域,复杂请求,后端为beego

    关于跨域,网上讲得很多,具体实施起来大多讲的不详细,贴我的vue端代码 require('es6-promise').polyfill() import fetch from 'isomorphic- ...

  9. Slackware网卡配置文件和配置工具

    Slackware 有关网卡的配置文件是/etc/rc.d/rc.inet1.conf , 这个文件包括乙太网接口的网卡和无线网卡的配置.Slackware 还是比较纯净的,网络配置也较简单:在Sla ...

  10. Leetcode605.Can Place Flowers种花问题

    假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有.可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去. 给定一个花坛(表示为一个数组包含0和1,其中0表示没种植花,1表示种植了花 ...