一、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之--变量的更多相关文章

  1. PL/SQL编程—变量

    SQL> declare c_tax_rate ,):=0.03; v_name ); v_passwd ); v_sale ,); v_tax_sale ,); begin select na ...

  2. 基于oracle 的PL/SQL编程 -变量使用

    1. 需要开启的服务:  本机安装的oracle ,默认是开机启动服务的,开机时间太慢,关闭了,需要手动打开: OracleDBConsoleorcl OracleOraDb10g_home1iSQL ...

  3. pl/sql 关于变量定义的问题

    1. create or replace procedure  test_prc(p_data_dt in date) IS e_name emp.ename%type;      begin sel ...

  4. PL/SQL编程--变量声明及赋值

    declare v_price ,);--单价 v_usenum number;--水费字数 v_usenum2 number;--使用吨数 begin v_price:=2.45;--每吨单价 v_ ...

  5. 二十四、oracle pl/sql 变量

    一.变量介绍在编写pl/sql程序时,可以定义变量和常量:在pl/sql程序中包括有:1).标量类型(scalar)2).复合类型(composite) --用于操作单条记录3).参照类型(refer ...

  6. oracle pl/sql 变量

    一.变量介绍在编写pl/sql程序时,可以定义变量和常量:在pl/sql程序中包括有:1).标量类型(scalar)2).复合类型(composite) --用于操作单条记录3).参照类型(refer ...

  7. Oracle PL/SQL编程之变量

    注: 以下测试案例所用的表均来自与scott方案,使用前,请确保该用户解锁. 1.简介 和大多数编程语言一样,在编写PL/SQL程序时,可以定义常量和变量,在pl/sql程序中包括有: a.标量类型( ...

  8. PL/SQL 02 声明变量 declare

    语法:identifier [CONSTANT] datatype [NOT NULL] [:= | DEFAULT expr] identifier:用于指定变量或常量的名称.CONSTANT:用于 ...

  9. pl/sql基础知识—定义并使用变量

    n  介绍 在编写pl/sql程序是,可以定义变量和常量:在pl/sql程序中包括有: ①标量类型(scalar) ②复合类型(composite) ③参照类型(reference) ④lob(lar ...

随机推荐

  1. java 版的复利计算器(张俊毅 周修文)

    (带有本金的选项卡的意思就是计算你在知道利率.年限和本息的情况下计算本金) 在利率的输入中能限制小数点的输入并且输入字母会被直接去除 每一个选项卡都有复利和单利的计算,并且在你计算之后会立即更新在下面 ...

  2. DecimalFormat 中的 # 与 0 的区别(中文帮助文档中翻译可能是错误的)

    想对数字进行格式化的时候,可能会使用到 java.text.DecimalFormat 类.中文帮助文档中,有如下符号 位置 本地化 含义 0 数字 是 阿拉伯数字 # 数字 是 阿拉伯数字,如果不存 ...

  3. 使用SignalR构建一个最基本的web聊天室

    What is SignalR ASP.NET SignalR is a new library for ASP.NET developers that simplifies the process ...

  4. Python入门笔记(18):Python函数(1):基础部分

    一.什么是函数.方法.过程 推荐阅读:http://www.cnblogs.com/snandy/archive/2011/08/29/2153871.html 一般程序设计语言包含两种基本的抽象:过 ...

  5. 基于Eclipse的Go语言可视化开发环境

    http://jingyan.baidu.com/article/d7130635032e2f13fdf475b8.html 基于Eclipse的Go语言可视化开发环境 | 浏览:2924 | 更新: ...

  6. ViewPager和Fragment的组合使用

    如图是效果图用的是Viewpager和fragment来实现的主界面 不过其中的预加载我没有解决 如下是代码代码比较简单 package com.ithello.dingding; import ja ...

  7. 机器学习实战 - 读书笔记(06) – SVM支持向量机

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习笔记,这次是第6章:SVM 支持向量机. 支持向量机不是很好被理解,主要是因为里面涉及到了许多数学知 ...

  8. Python on VS Code

    install python extension Press F1, and input "ext install python". Then the icon at the le ...

  9. linux下mysql忘记root密码解决方法

    如果使用 MySQL 数据库忘记了root账号密码,可以通过调节配置文件,跳过密码的方式登数据库, 在数据库里面修改账号密码,一般默认的账号是 root 1.编辑 MySQL 配置文件 my.cnf ...

  10. Python基础(一),Day1

    python的安装 python2.x与3.x的部分区别 第一个python程序 变量 字符编码 注释 格式化字符串 用户输入 常用的模块初始 if判断 循环语句 作业 1.python的安装 可以在 ...