PL/SQL程序块可背独立编译并存储在数据库中,任何与数据库相链接的应用程序均可以访问这些存储的PL/SQL程序块。ORACLE提供了四种类型的可存储的程序: 数据库
过程和函数
过程和函数都以编译后的形式存放在数据库中,函数能够没有参数也能够有多个参数并有一个返回值。过程有零个或多个参数,没有返回值。函数和过程均可以经过参数列表接收或返回零个或多个值,函数和过程的主要区别不在于返回值,而在于他们的调用方式。过程是做为一个独立执行语句调用的:
pay_involume(invoice_nbr,30,due_date);
函数以合法的表达式的方式调用:
order_volumn:=open_orders(SYSDATE,30);
建立过程的语法以下:
服务器
CREATE [ OR REPLACE] PROCEDURE [schema.]procedure_name [parameter_lister] {AS|IS} declaration_section BEGIN executable_section [EXCEPTION exception_section] END [procedure_name] |
每一个参数的语法以下:
paramter_name mode datatype [(:=|DEFAULT) value]
mode有三种形式:IN、OUT、INOUT。
IN表示在调用过程的时候,实际参数的取值被传递给该过程,形式参数被认为是只读的,当过程结束时,控制会返回控制环境,实际参数的值不会改变。
OUT在调用过程时实际参数的取值都将被忽略,在过程内部形式参数只能是被赋值,而不能从中读取数据,在过程结束后形式参数的内容将被赋予实际参数。
INOUT这种模式是IN和OUT的组合;在过程内部实际参数的值会传递给形式参数,形势参数的值可读也可写,过程结束后,形势参数的值将赋予实际参数。
建立函数的语法和过程的语法基本相同,惟一的区别在于函数有RETUREN子句
数据结构
CREATE [ OR REPLACE] FINCTION [schema.]function_name [parameter_list] RETURN returning_datatype {AS|IS} declaration_section BEGIN executable_section [EXCEPTION] exception_section END [procedure_name] |
在执行部分函数必须有哟个或多个return语句。
在建立函数中能够调用单行函数和组函数,例如:
函数
CREATE OR REPLACE FUNCTION my_sin(DegreesIn IN NUMBER) RETURN NUMBER IS pi NUMBER=ACOS(-1); RadiansPerDegree NUMBER; BEGIN RadiansPerDegree=pi/180; RETURN(SIN(DegreesIn*RadiansPerDegree)); END |
包
包是一种将过程、函数和数据结构捆绑在一块儿的容器;包由两个部分组成:外部可视包规范,包括函数头,过程头,和外部可视数据结构;另外一部分是包主体(package body),包主体包含了全部被捆绑的过程和函数的声明、执行、异常处理部分。
打包的PL/SQL程序和没有打包的有很大的差别,包数据在用户的整个会话期间都一直存在,当用户得到包的执行受权时,就等于得到包规范中的全部程序和数据结构的权限。但不能只对包中的某一个函数或过程进行受权。包能够重载过程和函数,在包内能够用同一个名字声明多个程序,在运行时根据参数的数目和数据类型调用正确的程序。
建立包必须首先建立包规范,建立包规范的语法以下:
spa
CREATE [OR REPLACE] PACKAGE package_name {AS|IS} public_variable_declarations | public_type_declarations | public_exception_declarations | public_cursor_declarations | function_declarations | procedure_specifications END [package_name] |
建立包主体使用CREATE PACKAGE BODY语句:
对象
CREATE [OR REPLACE] PACKAGE BODY package_name {AS|IS} private_variable_declarations | private_type_declarations | private_exception_declarations | private_cursor_declarations | function_declarations | procedure_specifications END [package_name] |
私有数据结构是那些在包主体内部,对被调用程序而言是不可见的。
触发器(Triggers)
触发器是一种自动执行响应数据库变化的程序。能够设置为在触发器事件以前或以后触发或执行。可以触发触发器事件的事件包括下面几种:
DML事件
DDL事件
数据库事件
DML事件触发器能够是语句或行级触发器。DML语句触发器在触发语句以前或以后触发DML行级触发器在语句影响的行变化以前或以后触发。用户能够给单一事件和类型定义多个触发器,但没有任何方法能够加强多触发器触发的命令。下表列出了用户能够利用的触发器事件:
事件
事件 | 触发器描述 |
INSERT | 当向表或视图插入一行时触发触发器 |
UPDATE | 更新表或视图中的某一行时触发触发器 |
DELETE | 从表或视图中删除某一行时触发触发器 |
CREATE | 当使用CREATE语句为数据库或项目增长一个对象时触发触发器 |
ALTER | 当使用ALTER语句为更改一个数据库或项目的对象时触发触发器 |
DROP | 当使用DROP语句删除一个数据库或项目的对象时触发触发器 |
START | 打开数据库时触发触发器,在事件后触发 |
SHUTDOWN | 关闭数据库时触发,事件前触发 |
LOGON | 当一个会话创建时触发,事件前触发 |
LOGOFF | 当关闭会话时触发,事件前触发 |
SERVER | 服务器错误发生时触发触发器,事件后触发 |
建立触发器的语法以下:
ci
CREATE [OR REPLACE] TRIGGER trigger_name {before|after|instead of} event ON {table_or_view_name|DATABASE} [FOR EACH ROW[WHEN condition]] trigger_body |
只有DML触发器(INSERT、UPDATE、DELETE)语句可使用INSTEAD OF触发器而且只有表的DML触发器能够是BEFORE或AFTER触发器。
象约束同样触发器能够被设置为禁用或启用来关闭或打开他们的执行体(EXECUTE),将触发器设置为禁用或启用使用ALTER TRIGGER语句:
it
ALTER TRIGGER trigger_name ENABLE; ALTER TRIGGER trigger_name DISABLE; |
要禁用或启用表的全部触发器,使用ALTER TABLE语句
io
ALTER TABLE table_name DISABLE ALL TRIGGERS; ALTER TABLE table_name ENABLE ALL TRIGGERS; |
删除触发器使用DROP TRIGGER
DROP TRIGGER trigger_name; |