目前的PL/SQL包括两部分,一部分是数据库引擎部分;另一部分是可嵌入到许多产品(如C语言,JAVA语言等)工具中的独立引擎。可以将这两部分称为:数据库PL/SQL和工具PL/SQL。

PL/SQL中的基本单位是块(Block),所有PL/SQL程序都是由块组成的。PL/SQL中的块由3部分组成:声明部分,程序代码、异常处理代码。如下:

DECLARE 

/* 声明部分: 在此声明PL/SQL用到的变量,类型及游标,以及局部的存储过程和函数 */

BEGIN

/*  执行部分:  过程及SQL 语句  , 即程序的主要部分  */

EXCEPTION

/* 执行异常部分: 错误处理  */

END;

面试题:如何解决系统慢的问题?如果使用的是传统方法,就需要优化SQL语句,还有另一种方法就是将SQL语句用PL/SQL写成模块,存储在Oracle中,用的时候直接调用。

好处:模块化的程序设计、更快、减少网络流量、提高代码的重用性和共享性、提高安全性(存储过程把表的具体字段封装好了)。

缺点:移植性不好(如由Oracle转向DB2时,所有存储过程都要重写)

一、过程

创建过程语法:

CREATE [OR REPLACE] PROCEDURE Procedure_name

[ (argment [ { IN | IN OUT }] Type,

argment [ { IN | OUT | IN OUT } ] Type ]

{ IS | AS }

<类型.变量的说明>

BEGIN

<执行部分>

EXCEPTION

<可选的异常错误处理程序>

END[Procedure_name];

  在PL/SQL 程序中还可以在块内建立本地函数和过程,这些函数和过程不存储在数据库中,但可以在创建它们的PL/SQL 程序中被重复调用。本地函数和过程在PL/SQL 块的声明部分定义,它们的语法格式与存储函数和过程相同,但不能使用CREATE OR REPLACE 关键字。

二、函数

创建函数语法:

CREATE [OR REPLACE] FUNCTION function_name

[(argment [ { IN| IN OUT }] type,

argment [ { IN | OUT | IN OUT } ] type]

RETURN return_type

{ IS | AS }

<类型.变量的说明>

BEGIN

FUNCTION_body(最后含return语句)

EXCEPTION

其它语句

END[function_name];

三、包和包体

创建包定义:

CREATE [OR REPLACE] PACKAGE package_name

[AUTHID {CURRENT_USER | DEFINER}]

{IS | AS}

[公有数据类型定义[公有数据类型定义]…]

[公有游标声明[公有游标声明]…]

[公有变量、常量声明[公有变量、常量声明]…]

[公有子程序声明[公有子程序声明]…]

END [package_name];

创建包主体:

CREATE [OR REPLACE] PACKAGE BODY package_name

{IS | AS}

[私有数据类型定义[私有数据类型定义]…]

[私有变量、常量声明[私有变量、常量声明]…]

[私有子程序声明和定义[私有子程序声明和定义]…]

[公有游标定义[公有游标定义]…]

[公有子程序定义[公有子程序定义]…]

BEGIN(??有吗)

PL/SQL 语句

END [package_name];

四、触发器

共5种。

创建触发器的一般语法是:

CREATE [OR REPLACE] TRIGGER trigger_name

{BEFORE | AFTER | INSTEAD OF}

{INSERT | DELETE | UPDATE [OF column [, column …]]}

ON {[schema.] table_name | [schema.] view_name}

[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]

[FOR EACH ROW ]

[WHEN condition]

trigger_body;

REFERENCING 子句说明相关名称,在行触发器的PL/SQL块和WHEN 子句中可以使用相关名称参照当前的新、旧列值,默认的相关名称分别为OLD和NEW。触发器的PL/SQL块中应用相关名称时,必须在它们之前加冒号(:),但在WHEN子句中则不能加冒号。

WHEN 子句说明触发约束条件。Condition 为一个逻辑表达时,其中必须包含相关名称,而不能包含查询语句,也不能调用PL/SQL 函数。WHEN 子句指定的触发约束条件只能用在BEFORE 和AFTER 行触发器中,不能用在INSTEAD OF 行触发器和其它类型的触发器中。

触发器触发次序:

step1:执行 BEFORE语句级触发器

step2:对与受语句影响的每一行

  执行 BEFORE行级触发器

  执行 DML语句

  执行 AFTER行级触发器

step3:执行 AFTER语句级触发器

触发器的限制

l  CREATE TRIGGER语句文本的字符长度不能超过32KB;

l  触发器体内的SELECT 语句只能为SELECT … INTO …结构,或者为定义游标所使用的SELECT 语句。

l  触发器中不能使用数据库事务控制语句 COMMIT; ROLLBACK, SVAEPOINT 语句;

l  由触发器所调用的过程或函数也不能使用数据库事务控制语句;

l  触发器中不能使用LONG, LONG RAW 类型;

l  触发器内可以参照LOB 类型列的列值,但不能通过 :NEW 修改LOB列中的数据;

l  触发器所访问的表受到表的约束限制,即后面的“变化表”。

问题:当触发器被触发时,要使用被插入、更新或删除的记录中的列值,有时要使用操作前、后列的值.实现:

:new  修饰符访问操作完成后列的值

:old  修饰符访问操作完成前列的值

特性

INSERT

UPDATE

DELETE

OLD

NULL

有效

有效

NEW

有效

有效

NULL

1、语句触发器(是指当某触发事件发生时,该触发器只执行一次)

CREATE [OR REPLACE] TRIGGER <触发器名>

[BEFORE|AFTER] <触发事件> ON <表名>

<PL/SQL程序体>

2、行触发器(是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次)

CREATE [OR REPLACE] TRIGGER <触发器名>

[BEFORE|AFTER] <触发事件> ON <表名>

FOR EACH ROW

<PL/SQL程序体>

当省略FOR EACH ROW 选项时,BEFORE 和AFTER 触发器为语句触发器,而INSTEAD OF 触发器则为行触发器。

3、INSTEAD OF 触发器(只适用于视图,ORACLE激活触发器,而不执行触发事件)

CREATE [OR REPLACE] TRIGGER <触发器名>

INSTEAD OF <触发事件> ON <表名>

<PL/SQL程序体>

4、用户事件触发器

5、系统事件触发器

PL/SQL(Procedure Language & Structured Query Language)的更多相关文章

  1. Oracle笔记--PL/SQL(Procedure Language & Structured Query Language)

    1.PL/SQL是一种高级数据库程序设计语言,专门用于在各种环境下对Oracle数据库进行访问.该语言集成于数据库服务器中,所以PL/SQL代码可以对数据进行快速高效的处理. 2.PL/SQL是对SQ ...

  2. oracle PL/SQL(procedure language/SQL)程序设计

    PL/SQL(procedure language/SQL)语言是Oracle对SQL语言的过程化扩充,是一个完整的编程语言.PL/SQL实现了过程化语句(如分支.循环等)与SQL语句的无缝连接,将过 ...

  3. oracle PL/SQL(procedure language/SQL)程序设计之异常(exception)

    什么是异常?在PL/SQL中的一个标识.在程序运行期间被触发的错误.异常是怎样被触发的?产生一个Oracle错误.用户显示触发.怎样处理异常?用异常处理句柄捕获异常.传播异常到调用环境. 捕获异常 E ...

  4. oracle PL/SQL(procedure language/SQL)程序设计之函数+过程+包

    匿名PL/SQL块回顾 DECLARE (可选)    定义在PL/SQL块中要使用的对象BEGIN (必须)    执行语句EXCEPTION (可选)    错误处理语句END; (必须)匿名块( ...

  5. oracle PL/SQL(procedure language/SQL)程序设计之函数+过程+包(转)

    匿名PL/SQL块回顾 DECLARE (可选)     定义在PL/SQL块中要使用的对象 BEGIN (必须)     执行语句 EXCEPTION (可选)     错误处理语句 END; (必 ...

  6. oracle PL/SQL(procedure language/SQL)程序设计之触发器(trigger)

    创建触发器 触发器类似于过程和函数,都拥有声明.执行和异常处理过程的带名PL/SQL块.与包类似,触发器必须存储在数据库中.前面已经讲过,过程是显式地通过过程调用执行的,同时过程调用可以传递参数.与之 ...

  7. oracle PL/SQL(procedure language/SQL)程序设计之游标cursors

    游标 Cursors--Conception 每一条被Oracle服务器执行的SQL语句都有一个独立的游标与之相关联:隐式游标 Implicit cursors: 用于所有的DML和PL/SQL的SE ...

  8. oracle PL/SQL(procedure language/SQL)程序设计(在PL/SQL中使用SQL)

    在PL/SQL程序中,允许使用的SQL语句只有DML和事务控制语句,使用DDL语句是非法的.使用SELECT语句从数据库中选取数据时,只能返回一行数据.使用COMMIT,  ROLLBACK, 和SA ...

  9. oracle PL/SQL(procedure language/SQL)程序设计--控制结构(if else )

    IF逻辑结构:IF-THEN-END IFIF-THEN-ELSE-END IFIF-THEN-ELSIF-END IF 语法 IF condition THEN  statements;[ELSIF ...

随机推荐

  1. Exceptionless安装的一些坑

    零.参考网站: https://www.cnblogs.com/zgshi/p/9152196.html 博客园上介绍.基本上介绍了如何安装和放到IIS上面. https://www.cnblogs. ...

  2. 2018-12-10 发布 vue全家桶实现的商城web-app,真实数据接口开发

    项目地址:https://github.com/Rosen97/web-shop.git 博客地址:https://segmentfault.com/a/1190000017323841

  3. GET 和 POST 区别?网上多数答案都是错的!

    最近在看<HTTP权威指南>这本书,对HTTP协议有了更深一层的了解. 在我们面试过程中关于HTTP协议有两个经典的面试题: 1. 谈谈HTTP中GET与POST的区别. 2. 在浏览器中 ...

  4. LeetCode.1005-K次取负数组和最大(Maximize Sum Of Array After K Negations)

    这是悦乐书的第376次更新,第403篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第237题(顺位题号是1005).给定一个整数数组A,我们必须按以下方式修改数组:我们选 ...

  5. DHCP迁移

    情况1:windows 2003迁移到windows 2003或者windows 2008,按照需要以下几个步骤:1.在源DHCP服务器导出DHCP数据文件,执行以下命令netsh dhcp serv ...

  6. vue项目与node项目分离

    为了前后端分离,我们在前端和api层中间,架构了一层node层,用来做服务端渲染,来加快用户的首屏可用和对搜索引擎的友好.项目一开始放置在同一个git仓库里面,分别放在client目录和server目 ...

  7. 《剑指offer》面试题6 重建二叉树 Java版

    (由一个二叉树的前序和中序序列重建一颗二叉树) 书中方法:我们要重建一棵二叉树,就要不断地找到根节点和根节点的左子结点和右子节点.注意前序序列, 它的第一个元素就是二叉树的根节点,后面的元素分为它的左 ...

  8. 【挣扎失败】2019CSP-S 游记

    妈耶…… 今年是作为高中生参赛的第一年……然而…… 心痛 洛谷评分,一橙一蓝两紫两黑 我个菜鸡瑟瑟发抖 在考完后三天的信息课码的,刚写没几个字就要下课了 抽空把这个写完

  9. 【统计】Causal Inference

    [统计]Causal Inference 原文传送门 http://www.stat.cmu.edu/~larry/=sml/Causation.pdf 过程 一.Prediction 和 causa ...

  10. const关键字 C与C++分析

    1 C与C++的区别 1.1.C允许定义两个变量名相同的变量,而C++不允许. 在C语言中是允许定义两个名字相同的全局变量.  在C++中是不允许定义两个名字相同的全局变量. 测试代码: /* 编译环 ...