存储过程和触发器
PL/SQL :
SQL的扩展
增加了过程化语句功能
基本结构是块
块之间可以互相嵌套
每个块完成一个逻辑操作
1.定义部分
DECLARE
------变量、常量、游标、异常等
定义的变量、常量等只能在该基本块中使用
当基本块执行结束时,定义就不再存在
2.执行部分
BEGIN
------SQL语句、PL/SQL的流程控制语句
EXCEPTION
------异常处理部分
END;
一、 条件控制语句
IF-THEN, IF-THEN-ELSE和嵌套的IF语句
1. IF condition THEN
Sequence_of_statements;
END IF
2. IF condition THEN
Sequence_of_statements1;
ELSE
Sequence_of_statements2;
END IF;
3. 在THEN和ELSE子句中还可以再包括IF语句,即IF语句可以嵌套
二、循环控制语句
LOOP, WHILE-LOOP和FOR-LOOP
1. 最简单的循环语句LOOP
LOOP
Sequence_of_statements;
END LOOP;
多数数据库服务器的PL/SQL都提供EXIT、BREAK或LEAVE等循环结束语句,保证LOOP语句块能够结束。
2. WHILE-LOOP
WHILE condition LOOP
Sequence_of_statements;
END LOOP;
每次执行循环体语句之前,首先对条件进行求值
如果条件为真,则执行循环体内的语句序列。
如果条件为假,则跳过循环并把控制传递给下一个语句
3. FOR-LOOP
FOR count IN [REVERSE]bound1 … bound2 LOOP
Sequence_of_statements;
END LOOP;
二、 存储过程的用户接口
1. 创建存储过程:
CREATE Procedure 过程名([参数1,参数2,...]) AS
<PL/SQL块>;
过程名:数据库服务器合法的对象标识
参数列表:用名字来标识调用时给出的参数值,必须指定值的数据类型。参数也可以定义输入参数、输出参数或输入/输出参数。默认为输入参数。
过程体:是一个<PL/SQL块>。包括声明部分和可执行语句部分
2. 执行存储过程
CALL/PERFORM Procedure 过程名([参数1,参数2,...]);
使用CALL或者PERFORM等方式激活存储过程的执行。
在PL/SQL中,数据库服务器支持在过程体中调用其他存储过程
触发器(Trigger)是用户定义在关系表上的一类由事件驱动的特殊过程
由服务器自动激活
可以进行更为复杂的检查和操作,具有更精细和更强大的数据控制能力
CREATE TRIGGER语法格式
CREATE TRIGGER <触发器名>
{ BEFORE | AFTER } <触发事件> ON <表名>
FOR EACH { ROW | STATEMENT }
[WHEN <触发条件>]
<触发动作体>
定义触发器的语法说明:
1. 创建者:表的拥有者
2. 触发器名
3. 表名:触发器的目标表
4. 触发事件:INSERT、DELETE、UPDATE
5. 触发器类型
行级触发器(FOR EACH ROW)
语句级触发器(FOR EACH STATEMENT)
触发器的执行,是由触发事件激活的,并由数据库服务器自动执行
一个数据表上可能定义了多个触发器
同一个表上的多个触发器激活时遵循如下的执行顺序:
执行该表上的BEFORE触发器;
激活触发器的SQL语句;
执行该表上的AFTER触发器。
嵌入式SQL
SQL语言提供了两种不同的使用方式:
交互式
嵌入式
为什么要引入嵌入式SQL
SQL语言是非过程性语言
事务处理应用需要高级语言
这两种方式细节上有差别,在程序设计的环境下,SQL语句要做某些必要的扩充
主语言
嵌入式SQL是将SQL语句嵌入程序设计语言中,被嵌入的程序设计语言,如C、C++、Java,称为宿主语言,简称主语言。
为了区分SQL语句与主语言语句, 所有SQL语句必须加前缀EXEC SQL,以(;)结束:
EXEC SQL <SQL语句>;