PL/SQL之--变量
一、PL/SQL 简介
PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。PL/SQL是oracle对sql语句的一种扩展,在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL就是把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算的程序语言,只能在oracle中运行。当然别的数据库也有自己的"pl/sql",这不是oracle特有的。如mysql也有,但是每种数据库的都不一样,功能也有些差别。oracle中的PL/SQL就比mysql中的强大许多。
PL/SQL 优点如下:
- 能够使一组SQL语句的功能更具模块化程序特点;
- 采用了过程性语言控制程序的结构;
- 可以对程序中的错误进行自动处理,使程序能够在遇到错误的时候不会被中断;
- 具有较好的可移植性,可以移植到另一个Oracle数据库中;
- 集成在数据库中,调用更快;
- 减少了网络的交互,有助于提高程序性能
PL/SQL块由四个基本部分组成:声明、执行体开始、异常处理、执行体结束。四个部分的基本结构如下:
DECLARE -- 可选部分
-- 变量、常量、游标、用户定义异常的声明
BEGIN -- 必要部分
-- SQL语句和PL/SQL语句构成的执行程序
EXCEPTION -- 可选部分
-- 程序出现异常时,捕捉异常并处理异常
END;-- 必须部分
二、PL/SQL变量
1、程序变量
PL/SQL支持SQL中的数据类型,包括NUMBER,VARCHAR2,DATE等Oracle SQL数据类型。声明变量必须指明变量的数据类型,也可以声明变量时对变量设置初始值,变量声明必须在DECLARE部分。声明变量的语法如下:
变量名 数据类型 := 初始值; --设置初始值
变量名 数据类型; --不设置初始值
变量的赋值必须在begin与end直接进行。可以直接使用 := 赋值,也可以使用select语句中的into进行赋值。代码示例如下:
DECLARE
v_name VARCHAR2(50); --声明变量
v_nickname VARCHAR2(50) := '小王'; --声明变量,并设置初始值
v_age NUMBER;
BEGIN
v_name := '王五'; --为变量赋值
SELECT age INTO v_age FROM person WHERE id = 1; --通过查询的方式设置值
-- 使用oracle dbms输出每个变量的值
dbms_output.put_line('v_name:'||v_name);
dbms_output.put_line('v_nickname:'||v_nickname);
dbms_output.put_line('v_age:'||v_age);
END;
2、程序常量
对于查询常量来说,必须在声明的时候给它赋值。而且不能再次设置它的值。这类似于java中的常量。程序常量使用constant在声明的时候进行修饰,声明语法如下:
变量名 constant 数据类型 := 初始值; --设置初始值
实例代码如下;
DECLARE
c_nickname constant VARCHAR2(50) := '小王'; --声明一个常量,并设置初始值 ,不设置初始值会报错
BEGIN
--c_nickname := '王五'; --为常量赋值会报错
dbms_output.put_line('c_nickname:'||c_nickname); --打印常量的值
END;
3、绑定变量
在sql plus中可以使用绑定变量,使用方式如下:
声明:
var v_name varchar2(50);
赋值
execute :v_name :='hello world';
打印结果
print v_name;
打印结果如下:
该变量仅存在于当前会话中,如果当前会话关闭,重新开启一个连接,则该变量就会不存在。
三、变量类型
以下示例代码中person表结构如下:
id NUMBER(11) NOT NULL ,
username VARCHAR2(255 ) NULL ,
age NUMBER(11) NULL ,
password VARCHAR2(255) NULL ,
PRIMARY KEY (id)
) -- ----------------------------
-- Records of PERSON
-- ----------------------------
INSERT INTO PERSON VALUES ('', '张三', '', 'zhang123');
INSERT INTO PERSON VALUES ('', '李四', '', 'lisi123');
INSERT INTO PERSON VALUES ('', '王五', '', 'wang123');
INSERT INTO PERSON VALUES ('', '赵六', '', 'zhao123');
1、%type
%type主要是用来定义某个变量的数据类型与已知的变量数据类型或表中某个类的数据类型相同。使用%type的好处如下: 一、当我们不知道数据表中的某个字段的数据类型我们就可以使用;二、数据库中字段的数据类型可以在运行时已经发生改变,此时我们无需修改程序,因为程序中的%type会随字段类型发生相应的变坏。
声明语法如下:
变量名称 表名.字段名%type;
示例代码如下:
DECLARE
v_id person.id%TYPE ; -- v_id变量数据类型是person表中id的数据类型
v_username person.username%TYPE ; -- v_id变量数据类型是person表中username的数据类型
v_age person.age%TYPE ; -- v_id变量数据类型是person表中age的数据类型
v_password person.password%TYPE ; -- v_id变量数据类型是person表中password的数据类型
BEGIN
SELECT
ID, username, age, password
INTO
v_id, v_username, v_age, v_password
FROM
person
WHERE
ID = 1 ;
dbms_output.put_line ('id:' || v_id) ;
dbms_output.put_line ('username:' || v_username) ;
dbms_output.put_line ('age:' || v_age) ;
dbms_output.put_line ('password:' || v_password) ;
END ;
查询id为1的记录,并打印结果。
2、%rowtype
%rowtype也是用于定义不确定类型的变量,可以理解成数据库记录一行提取出来的一个副本。通过%rowtype,我们可以获取一行记录,然后再使用变量.属性名,获取单个的属性值。声明%rowtype的语法如下:
变量名 表名%rowtype;
示例代码如下:
DECLARE
r_person person%rowtype; -- 表示person表的一行
BEGIN
-- 方式一赋值
SELECT id, username, age, password INTO r_person.id, r_person.username, r_person.age, r_person.password FROM person WHERE id=1;
dbms_output.put_line('id:'||r_person.id);
dbms_output.put_line('username:'||r_person.username);
dbms_output.put_line('age:'||r_person.age);
dbms_output.put_line('password:'||r_person.password);
-- 方式二赋值
SELECT * INTO r_person FROM person WHERE id = 2;
dbms_output.put_line('id:'||r_person.id);
dbms_output.put_line('username:'||r_person.username);
dbms_output.put_line('age:'||r_person.age);
dbms_output.put_line('password:'||r_person.password);
END ;
我们可以使用上面两种方式进行赋值。在游标中可以用到。
3、varray
varray(varing array)是PL/SQL中的动态数组类型.我们可以动态地对数组的大小进行扩展,但是扩展后的总大小,不能超过声明时候的大小。使用varray的时候,需要先声明一个varray数组的类型,然后声明一个变量并把这个类型赋值给它。使用的时候都是操作这个声明的变量。
示例如下:
DECLARE
TYPE arrays IS VARRAY(7) OF VARCHAR2(10) ; -- 定义一个数组,数组元素是5个,每个元素类型为varchar2(10)
-- arrays 是一个对象,使用前需要用一个变量去引用,v_list是变量
v_list arrays := arrays ('zhangsan', 'lisi', 'wangwu', 'zhaoliu', 'wangw') ;
asize NUMBER ; -- 记录数组大小
BEGIN
dbms_output.put_line (v_list(1)) ;
dbms_output.put_line (v_list(2)) ;
dbms_output.put_line (v_list(3)) ;
dbms_output.put_line (v_list(4)) ;
dbms_output.put_line (v_list(5)) ;
-- dbms_output.put_line(v_list(6)); -- 此时打印会保持下标越界。
asize := v_list.COUNT() ;
dbms_output.put_line ('total:' || asize) ;
-- 对v_list大小进行增加
v_list.EXTEND(2) ; -- 此时增加后的总共元素不能超过声明时候的大小
asize := v_list.COUNT() ;
dbms_output.put_line('total:' || asize) ;
v_list (6) := 'xiaozhao' ;
v_list (7) := 'xiaoli' ;
dbms_output.put_line (v_list(6)) ;
dbms_output.put_line (v_list(7)) ;
-- 对v_list大小进行减少
v_list.TRIM(2) ;
asize := v_list.COUNT() ;
dbms_output.put_line('total:' || asize) ;
END ;
16行对数组进行扩展,17行对数组大小进行减小。运行结果如下:
4、table
table 类型与javascript中数组类似,可以理解成可变数组。可以理解成它的大小是无穷的,我们可以给它的任何索引对应的空间进行赋值,声明的时候也无需指定它的大小。
示例代码如下:
DECLARE
TYPE strings IS TABLE OF VARCHAR2(10) --元素类型是varchar2(10)
INDEX BY binary_integer;
v_list strings; -- 定义的table不能直接使用,必须赋给另一个变量
BEGIN
v_list(1) := 'hello';
v_list(9999) := 'world';
v_list(99) := 33; --赋值数字,会被转换成字符 ,如果类型是数字,赋值字符的时候,则会报错
dbms_output.put_line(v_list(1));
dbms_output.put_line(v_list(99));
dbms_output.put_line(v_list(9999));
END;
运行结果如下:
5、record
record可以理解成java中的集合,可以存放多种类型的数据。record也是需要先声明,然后用声明变量来赋值,再操作变量。
示例代码如下:
DECLARE
TYPE v_record IS RECORD (
id number,
username person.username%TYPE,
r_tb_person person%ROWTYPE
);
v_person v_record; -- record 不能直接使用,必须赋值给变量
BEGIN
/* select id, username, age, password into v_person.r_tb_person.id, v_person.r_tb_person.username, v_person.r_tb_person.age, v_person.r_tb_person.password from person where id=1; 该种方式赋值也可以*/
SELECT * INTO v_person.r_tb_person FROM person WHERE id = 1 ;
dbms_output.put_line('id:'||v_person.r_tb_person.id);
dbms_output.put_line('username:'||v_person.r_tb_person.username);
dbms_output.put_line('age:'||v_person.r_tb_person.age);
dbms_output.put_line('password:'||v_person.r_tb_person.password);
END ;
PL/SQL之--变量的更多相关文章
- PL/SQL编程—变量
SQL> declare c_tax_rate ,):=0.03; v_name ); v_passwd ); v_sale ,); v_tax_sale ,); begin select na ...
- 基于oracle 的PL/SQL编程 -变量使用
1. 需要开启的服务: 本机安装的oracle ,默认是开机启动服务的,开机时间太慢,关闭了,需要手动打开: OracleDBConsoleorcl OracleOraDb10g_home1iSQL ...
- pl/sql 关于变量定义的问题
1. create or replace procedure test_prc(p_data_dt in date) IS e_name emp.ename%type; begin sel ...
- PL/SQL编程--变量声明及赋值
declare v_price ,);--单价 v_usenum number;--水费字数 v_usenum2 number;--使用吨数 begin v_price:=2.45;--每吨单价 v_ ...
- 二十四、oracle pl/sql 变量
一.变量介绍在编写pl/sql程序时,可以定义变量和常量:在pl/sql程序中包括有:1).标量类型(scalar)2).复合类型(composite) --用于操作单条记录3).参照类型(refer ...
- oracle pl/sql 变量
一.变量介绍在编写pl/sql程序时,可以定义变量和常量:在pl/sql程序中包括有:1).标量类型(scalar)2).复合类型(composite) --用于操作单条记录3).参照类型(refer ...
- Oracle PL/SQL编程之变量
注: 以下测试案例所用的表均来自与scott方案,使用前,请确保该用户解锁. 1.简介 和大多数编程语言一样,在编写PL/SQL程序时,可以定义常量和变量,在pl/sql程序中包括有: a.标量类型( ...
- PL/SQL 02 声明变量 declare
语法:identifier [CONSTANT] datatype [NOT NULL] [:= | DEFAULT expr] identifier:用于指定变量或常量的名称.CONSTANT:用于 ...
- pl/sql基础知识—定义并使用变量
n 介绍 在编写pl/sql程序是,可以定义变量和常量:在pl/sql程序中包括有: ①标量类型(scalar) ②复合类型(composite) ③参照类型(reference) ④lob(lar ...
随机推荐
- UIApplication和delegate代理
所有的移动操作系统都有个致命的缺点:app很容易受到打扰,比如一个来电或者锁屏都会导致app进入后台甚至被终止 还有很多其他类似的情况会导致app受到干扰,在app受到干扰时,会产生一些系统事件,这是 ...
- IOS开发UI基础storyboard相关概念的认识
本文主要介绍一些基本的概念 为后面的学习做个准备 需要了解的知识点有以下几个方面: storyboard文件的认识 IBAction 和IBOutlet UIViewController控制器的认识 ...
- ThroughRain第一次冲刺个人总结
团队名:ThroughRain 项目确定:<餐厅到店点餐系统> 项目背景:本次项目是专门为餐厅开发的一套订餐系统.大家有没有发现在节假日去餐厅吃饭会超级麻烦,人很多, 热门的餐厅基本没有座 ...
- oracle 查询 当前最大时间的value的值
数据列表: table : text id datetime name value 1 2015-03-1 张三 3400 2 2015-03-1 ...
- Interlocked.CompareExchange
class SourceManager { private SourceManager() { } private static SourceManager sourceManager; public ...
- Xcode配置libdc1394
libdc1394是一个开源库,提供了一个Mac下完整的1394相机编程接口,这篇文章将介绍Xcode如何配置该库. 步骤: 1.下载libdc1394的源码,并解压 http://damien.do ...
- 做java工作整整1年了,看到了大牛的奋斗历程,我感觉自己又有目标了
2014年6月,刚刚踏上社会那会儿,我记得我第一次面试啥都不知道,穿的也不修边幅去应聘一家4s销售,面试官看到我,我明细感觉到了对方厌恶的神色,这是我上社会的第一课,找工作不管是什么工作,衣着得体,是 ...
- Python学习之Python简介
Python简介 Python的由来 Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象.解释型计算机程序设计语言,它是吉多·范罗苏姆(Guide van ...
- mvc项目架构搭建之UI层的搭建
项目架构搭建之UI层的搭建 Contents 系列一[架构概览] 0.项目简介 1.项目解决方案分层方案 2.所用到的技术 3.项目引用关系 系列二[架构搭建初步] 4.项目架构各部分解析 5.项目创 ...
- CSS3选择器(一)
E[att^='val'] 选择属性值以val开头的任何字符 E[att$='val'] 选择属性值以val结尾的任何字符 E[att*='val'] 选择属性值包含val的任何字符 :root HT ...