一、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. Python入门笔记(19):Python函数(2):函数/方法装饰器

    一.装饰器(decorators) 装饰器的语法以@开头,接着是装饰器函数的名字.可选参数. 紧跟装饰器声明的是被装饰的函数和被装饰的函数的可选参数,如下: @decorator(dec_opt_ar ...

  2. 根据Expander的IsExpanded属性值的变化动态设计Control的size

    简要说明: 当Expander 的IsExpanded属性为“True” 时给控件设个尺寸(此处为高度),当为“False”时给控件设另外一个值. 知识点:数据绑定.Style和Trigger < ...

  3. Visual Studio中设置默认VC++路径

    菜单"View" -> "Other Windows" -> "Property Manager" 选择对应的配置并修改即可.

  4. custom struts framework

    1. Difference between stucts1 and struts2 struts1 : Servlet used as Controller , you can visit the S ...

  5. 利用PBFunc在Powerbuilder中解析Json对象

    利用PBFunc工具在Powerbuilder解析json,只需要调用getattribute方法来获取 解析unicode格式的json: n_pbfunc_json lnv_json lnv_js ...

  6. 中国快递包裹总量的预测-基于SARIMA模型

    code{white-space: pre;} pre:not([class]) { background-color: white; }if (window.hljs && docu ...

  7. 想当站长请立即使用Orchard

    其实早在很多年前我就一直有一个梦想,那就是那个网站当个站长,和各位有共同爱好的人成为朋友,很多年了虽然有了这个能力却没有了这个心情,成为了程序员却天天被程序玩. 最近几年一直从事C#方面的软件开发,基 ...

  8. ANSI X9.19 MAC算法

    /// <summary> /// 获取MAC校验字节数据 /// </summary> /// <param name="bankData"> ...

  9. Oracle不足与MySQL优势

    Oracle库主要不足:1.单点故障:2.付费License;3.不支持水平扩展. MySQL及水平拆库的优势:1.单点故障影响率1/N:2.免费:3.可低成本水平扩展,近乎无限的水平扩展能力.

  10. httpclient 认证方式访问http api/resutful api并获取json结果

    最近,因公司线上环境rabbitmq经常发生堆积严重的现象,于是跟运维组讨论,帮助开发个集中监控所有rabbitmq服务器运行情况的应用,需要通过java访问rabbitmq暴露的http api并接 ...