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 ...
随机推荐
- Twitter算法面试题详解(Java实现)
最近在网上看到一道Twitter的算法面试题,网上已经有人给出了答案,不过可能有些人没太看明白(我也未验证是否正确),现在给出一个比较好理解的答案.先看一下题目. 图1 先看看图图1.可以将方块看做砖 ...
- [Solution] DI原理解析及Castle、Unity框架使用
本节目录 DI介绍 DI基本原理 DI框架 Castle Windsor Unity Autofac Spring.Net DI介绍 控制反转(Inversion of Control,英文缩写为Io ...
- [SQL] Oracle基础语法
1.安装: oracle11g server 这里的口令为sys和system的密码.(10版本以前默认用户会有系统默认密码.) Oracle 11g 默认用户名和密码 oracle11g clien ...
- Gradle学习系列之四——增量式构建
在本系列的上篇文章中,我们讲到了如何读懂Gradle的语法,在本篇文章中,我们将讲到增量式地构建项目. 请通过以下方式下载本系列文章的Github示例代码: git clone https://git ...
- TortoiseSVN的bin目录下面没有svn.exe
自己在idea联合svn时遇到这个问题,然后bd和gg,发现很多人都乱说,说什么TortoiseSVN是客户端,默认不包含svn.exe,需要安装Subversion.bullshit! 之所以没有, ...
- AC自动机 - 多模式串的匹配运用 --- HDU 2896
病毒侵袭 Problem's Link:http://acm.hdu.edu.cn/showproblem.php?pid=2896 Mean: 略 analyse: AC自动机的运用,多模式串匹配. ...
- 购物车信息存cookie
//以商品为单位分别存入到各个不同的cookie中,避免因为cookie值过大,导致数据存储失败 $cart_info_one[brand_name] = $parent['brand_name']; ...
- PHP遍历目录四种方法
学习SPL的时候,遇到了DirectoryIterator这个目录类,谢了一下遍历目录的方法.于是总结一下遍历目录的四种写法 如下: <?php /* * 方法一:利用SPL的目录类,这个很简单 ...
- java service wrapper 级别为info导致内存剧增直至溢出
上周,公司某一环境发生java service wrapper内存剧增导致最后被自动killed的情况,经过分析,确定导致java service wrapper(后续简称wrapper)守护进程内存 ...
- jQuery coveringBad 效果对比
Covering-Bad 是一个可拉动大小的元素,覆盖在原有的元素上面,从而两者进行对比. 在线实例 实例演示1 实例演示2 使用方法 <div class="covered&q ...