第7章 存储过程和触发器

合集下载

第7章 存储过程和触发器

第7章  存储过程和触发器
【例7.8】 对例7.2中创建的存储过程student_info1进行修 改,将第一个参数改成学生的学号。
ALTER PROCEDURE student_info1
( @number char(6), @cname char(16) ) AS SELECT 学号, 课程名, 成绩 FROM CJB, KCB
WHERE CJB.学号=@number and KCB.课程名=@cname
GO
数据库应用技术
4、使用T-SQL命令删除存储过程
从数据库中删除存储过程时,使用DROP PROCEDURE 语句可永久地删除存储过程。 语法格式: DROP PROCEDURE 过程名
【例7.9】 删除student_info1存储过程。
数据库应用技术 二、存储过程的优点
(1)执行速度快。
存储过程在服务器端运行,执行速度快。 (2)提高工作效率和系统性能。 存储过程在创建后,可以被多次调用。可以将经常执行 的操作创建成存储过程,在以后的操作中多次调用, 而不必重新书写语句。 存储过程经过编译后,其执行规划就驻留在高速缓冲存 储器,在以后的操作中只需从高速缓冲存储器中调用 已编译好的二进制代码执行,无需每次编译,提高了 系统的性能。
数据库应用技术
三、存储过程的类型
(1) 系统存储过程
是由系统提供的存储过程。它定义在系统数据库 master中,其前缀是sp_,例如sp_addtype。系统存储 过程可在任何数据库中使用。 (2) 扩展存储过程 通常以动态链接库(.dll)形式存在,使用时,加载到 SQL Server中。其前缀是xp_。 (3) 用户存储过程
数据库应用技术
(3) 使用带输出参数( OUPUT)的存储过程。
【例7.3】 创建存储过程do_insert,作用是向XSB表中插入 一行数据。 创建存储过程do_insert: CREATE PROCEDURE do_insert

数据库第7章 触发器和存储过程

数据库第7章 触发器和存储过程

第7章触发器和存储过程数据完整性约束是指保证数据库中的数据符合现实中的实际情况,或者说,数据库中存储的数据要有实际意义。

我们在第4章介绍了在定义关系表时实现数据的完整性约束的方法,包括实体完整性、参照完整性和用户定义的完整性约束三个方面,本章我们将介绍复杂的数据完整性约束实现方法——触发器。

存储过程是SQL 语句和控制流语句的预编译集合,它以一个名称存储并作为一个单元处理,应用程序可以通过调用的方法执行存储过程。

存储过程使得对数据库的管理和操作更加容易,并且可以提高数据的操作效率。

7.1 触发器触发器是一段由对数据的更改操作引发的自动执行的代码,这些更改操作包括UPDATE、INSERT 或DELETE。

触发器通常用于保证业务规则和数据完整性,其主要优点是用户可以用编程的方法实现复杂的处理逻辑和商业规则,增强了数据完整性约束的功能。

触发器可以实现比CHECK约束更复杂的数据约束。

从第4章的例子我们可以看到,CHECK约束只能约束位于同一个表上的列之间的取值约束,比如“最低工资小于等于最高工资”,如果被约束的列位于两个不同表中,比如,假设有职工表(职工号,姓名,工作编号,工资)和工作表(工作编号,最低工资,最高工资),如果要求职工的工资在工作表中相应工作的最低工资和最高工资范围内,这样的约束CHECK就无能为力了,这种情况就需要使用触发器来实现。

触发器是定义在某个表上的,用于限制该表中的某些约束条件,但在触发器中可以引用其它表中的列。

例如,触发器可以使用另一个表中的列来比较插入或更新的数据是否符合要求。

7.1.1创建触发器建立触发器时,要指定触发器的名称、触发器所作用的表、引发触发器的操作以及在触发器中要完成的功能。

建立触发器的SQL语句为:CREATE TRIGGER ,其语法格式为:CREATE TRIGGER 触发器名称ON {表名 | 视图名}{ FOR | AFTER | INSTEAD OF }{ [ INSERT ] [ , ] [ DELETE ] [ , ] [UPDATE ] }ASSQL 语句其中:●触发器名称在数据库中必须是惟一的。

实验7 创建和管理存储过程和触发器

实验7  创建和管理存储过程和触发器

实验7 创建和管理存储过程和触发器实验目的●了解存储过程的类型和作用,并掌握使用Transact-SQL语言创建存储过程的方法●理解触发器的特点和作用,并掌握使用Transact-SQL语言创建触发器的方法背景知识存储过程是一组为了完成特定功能的SQL语句和流程控制语句的集合,经编译后存储在数据库服务器中。

它在服务器端对数据库记录进行处理,再把结果返回到客户端。

使用存储过程,可以充分利用服务器端的速度和计算能力,同时也避免把大量的数据从服务器端下载到客户端,从而减少了网络的数据流量,服务器端只需要返回计算结果给客户端即可。

因此,对于客户端来说,可以不必关心后台数据结构的变化。

存储过程可分为两类:即系统存储过程和用户自定义存储过程。

系统存储过程主要存储在master 数据库中并以sp_为前缀,它主要是从系统表中获取信息,尽管这些系统存储过程被放在master数据库中,但是仍可以在其它数据库中对其进行调用,在调用时不必在存储过程名前加上数据库名。

而且当创建一个新数据库时,一些系统存储过程会在新数据库中被自动创建。

触发器是一种特殊类型的存储过程,但它不等同于存储过程,主要区别在于触发器主要是通过事件进行触发而被执行的,当事件发生时触发器由SQL Server自动执行,而存储过程则是通过指定存储过程的名字并给出参数(如果该存储过程带有参数)而被直接调用的。

每个触发器有两个特殊的表:插入表(inserted)和删除表(deleted)。

这两个表是逻辑表,并且这两个表是由系统管理的,存储在内存中,不是存储在数据库中,因此不允许用户直接对其修改。

这两个表的结构总是与被该触发器作用的表有相同的表结构。

这两个表是动态驻留在内存中的,当触发器工作完成,这两个表也被删除。

这两个表主要保存因用户操作而被影响到的原数据值或新数据值。

另外这两个表是只读的,即用户不能向这两个表写入内容,但可以引用表中的数据,例如可以使用“select * from deleted”语句来查看deleted表中的信息。

存储过程与触发器

存储过程与触发器

存储过程与触发器存储过程和触发器是关系型数据库中非常重要的概念和工具。

存储过程是一组预编译的SQL语句集合,经编译后存储在数据库中,可以被反复调用执行。

而触发器是数据库中一种特殊的对象,它与表相关联,当特定的事务操作(如INSERT、UPDATE、DELETE)在关联的表上执行时,触发器会自动执行相应的操作。

在本文中,将详细介绍存储过程和触发器的应用场景和使用方法。

存储过程的优势主要体现在以下几个方面:1.提高性能:存储过程可以减少网络传输的开销,将数据库操作逻辑集中在数据库服务器上执行,减少了网络延迟时间。

此外,存储过程可以预先编译和优化,提高了执行效率。

2.简化开发:存储过程可以将常用的业务逻辑封装在一起,减少了代码的重复编写。

开发人员只需调用存储过程,而不必重复编写相同的SQL语句。

3.减少安全风险:存储过程可以对数据库操作进行权限控制,通过给用户分配不同的执行权限,提高了数据库的安全性。

4.数据库事务管理:存储过程可以将一系列数据库操作封装在一个事务中,保证了数据的一致性和完整性。

触发器的主要优势在于:1.强制数据完整性:触发器可以通过在特定操作之前或之后执行代码,强制执行特定的条件和限制,确保数据库中的数据始终保持一致性和完整性。

2.隐藏复杂逻辑:触发器可以将复杂的业务逻辑隐藏在数据库中,使应用程序的逻辑更加简洁和清晰。

3.自动化处理:触发器可以自动执行一些操作,如更新相关表的数据,发送电子邮件等,减少了人工操作的需要,提高了工作效率。

下面以一个具体的例子来说明存储过程和触发器的使用。

假设有一个订单管理系统,包括订单表和订单明细表。

当插入一个订单时,触发器会自动计算订单的总金额,并更新到订单表中的"total_amount"字段中。

首先创建一个计算订单总金额的存储过程:CREATE PROCEDURE calculateTotalAmountASBEGINFROM order_detailsUPDATE ordersEND然后创建一个触发器,当插入新的订单明细时,自动调用存储过程计算订单的总金额:CREATE TRIGGER updateTotalAmountON order_detailsAFTERINSERTASBEGINFROM inserted;END通过以上的存储过程和触发器,当插入新的订单明细时,触发器会自动调用存储过程计算订单的总金额,并更新到订单表中。

第07章存储过程和触发器

第07章存储过程和触发器
2013-7-12 27
(6) 使用 WITH ENCRYPTION 选项
WITH ENCRYPTION 子句对用户隐藏存储过程的文本。 【例7.6】创建加密过程,使用 sp_helptext 系统存储过程获取关于加 密过程的信息,然后尝试直接从 syscomments 表中获取关于该过程的 信息。 IF EXISTS (SELECT name FROM sysobjects WHERE name = 'encrypt_this' AND type = 'P') DROP PROCEDURE encrypt_this GO USE XSCJ GO CREATE PROCEDURE encrypt_this WITH ENCRYPTION AS SELECT * FROM XS GO
2013-7-12
12
几点注意: 用户定义的存储过程只能定义在当前数据库中 用户创建的存储过程归数据库所有者(dbo)拥有 创建存储过程创建的三种方法: T-SQL 企业管理器 向导
2013-7-12
13
1.通过SQL命令创建存储过程 1) 创建存储过程 语法格式: CREATE PROC [ EDURE ] procedure_name [ ; number ] /*定义过程名*/ [ { @parameter data_type } /*定义参数的类型*/ [ VARYING ] [ = default ] [ OUTPUT ] ] /*定义参数的属性*/ [ ,...n] [ WITH { RECOMPILE | ENCRYPTION |}] /*定义存储过程的处理方式*/ [ FOR REPLICATION ] AS sql_statement [ ...n ] /*执行的操作*/

数据库存储过程与触发器

数据库存储过程与触发器

数据库存储过程与触发器1. 引言数据库存储过程和触发器是数据库中常用的两种功能,它们可以通过在特定情况下自动执行一系列的操作,极大地提高了数据库系统的灵活性和功能性。

本文将介绍数据库存储过程和触发器的概念、作用和用法,并且以示例的方式详细展示它们在实际应用中的应用场景。

2. 数据库存储过程2.1 概念数据库存储过程是一组预定义的操作序列,它们以原子的方式执行,可以被多个应用程序调用。

存储过程通常用于处理复杂的业务逻辑、数据处理和数据验证等任务。

存储过程可以在数据库系统中被创建、编辑和执行,可以接受参数来灵活地适应不同的需求。

2.2 作用数据库存储过程具有以下几个重要的作用:•提高性能:存储过程在数据库服务器上执行,可以减少网络传输开销,提高数据库的响应速度。

•简化开发:存储过程将一些常用的操作封装起来,开发者可以通过简单的调用存储过程来完成复杂的业务逻辑,减少了开发工作量。

•保证数据的一致性:存储过程可以通过事务控制来确保数据的一致性和完整性。

2.3 用法数据库存储过程的用法如下:1.创建存储过程:使用CREATE PROCEDURE语句来创建存储过程,并定义输入参数、输出参数和过程体。

CREATE PROCEDURE procedure_name [ (parameter1, parameter2, ...)][RETURNS return_type]BEGIN-- 过程体END;2.执行存储过程:使用CALL语句来执行存储过程,并传递参数。

CALL procedure_name (parameter1, parameter2, ...);3.删除存储过程:使用DROP PROCEDURE语句来删除存储过程。

DROP PROCEDURE procedure_name;4.查看存储过程的定义:使用SHOW PROCEDURE STATUS语句来查看数据库中的存储过程。

SHOW PROCEDURE STATUS;3. 数据库触发器3.1 概念数据库触发器是与表相关联的特殊类型的存储过程,它们在表上的特定操作(插入、更新、删除)发生时自动执行。

存储过程与触发器.ppt

存储过程与触发器.ppt

13
参数说明
默认值:参数的默认值。如果定义了默认值, 默认值:参数的默认值。如果定义了默认值, 不必指定该参数的值即可执行存储过程。 不必指定该参数的值即可执行存储过程。默认 值必须是常量或NULL。如果要在存储过程中 值必须是常量或 。 对该参数使用LIKE关键字,那么默认值中可 关键字, 对该参数使用 关键字 以包含通配符( 、 、 和 )。 以包含通配符(%、_、[]和[^])。 OUTPUT:表明参数是返回参数。该选项的值 :表明参数是返回参数。 可以返回给EXEC[UTE]。使用 可以返回给 。使用OUTPUT参数 参数 可将信息返回给调用过程。 可将信息返回给调用过程。text、ntext和image 、 和 参数可用作OUTPUT参数。使用 参数。 参数可用作 参数 使用OUTPUT关键 关键 字的输出参数可以是游标占位符。 字的输出参数可以是游标占位符。
15
存储过程定义
1.无参数存储过程 无参数存储过程
2.有参数存储过程(输入参数、输出参数output) 有参数存储过程(输入参数、输出参数 有参数存储过程 )
16
例题1 建立一个查询存储过程, 例题1:建立一个查询存储过程,实现 查询成绩表中的所有及格成绩。( 。(无参 查询成绩表中的所有及格成绩。(无参 数存储过程) 数存储过程)
create proc seleproc as select * from 成绩表 where 成绩 成绩>=60 执行存储过程: 执行存储过程: exec seleproc 结果如图: 结果如图:
17
例2:创建一个向成绩表添加记录的存储 过程。(有参数存储过程) 。(有参数存储过程 过程。(有参数存储过程)
create proc insertproc @sno char(10),@cno char(3),@grade float as insert into 成绩表 values(@sno,@cno,@grade) 执行存储过程: 执行存储过程: exec insertproc '0009','03',98

数据库的存储过程和触发器

数据库的存储过程和触发器

从MySQL5.0版本开始就对存储过程和触发器进行了支持,在MySQL进行学习前,先查看您所使用的版本吧,方法有:1.$mysql -V //linux终端下2.select version(); //mysql下3. mysql --help | grep Distrib //linux终端下在了解您所使用的版本支持情况下再下一步存储过程sql语句执行的时候要先编译,然后执行。

存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。

用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。

一、存储过程介绍存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可。

在ORACLE中,若干个有联系的过程可以组合在一起构成程序包。

存储过程是利用SQL Server所提供的Tranact-SQL语言所编写的程序。

Tranact-SQL语言是SQL Server提供专为设计数据库应用程序的语言,它是应用程序和SQL Server数据库间的主要程序式设计界面。

它好比Oracle数据库系统中的Pro-SQL和Informix的数据库系统能够中的Informix- 4GL语言一样。

这类语言主要提供以下功能,让用户可以设计出符合引用需求的程序:1)、变量说明2)、ANSI兼容的SQL命令(如Select,Update….)3)、一般流程控制命令(if…else…、while….)4)、内部函数二、使用存储过程有以下的优点:* 存储过程的能力大大增强了SQL语言的功能和灵活性。

存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

* 可保证数据的安全性和完整性。

# 通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。

七存储过程和触发器

七存储过程和触发器

实验七存储过程和触发器
一、实验目的
✓掌握通过企业管理器和Transact—sql语句SCREATE PROCEDURE创建存储过程的方法和步骤。

✓掌握通过企业管理器和Transact—sql语句Execute执行存储过程的方法。

✓掌握通过企业管理器和Transact—sql语句SCREATE PROCEDURE创建触发器的方法和步骤。

✓掌握引发触发器的方法。

✓学会使用系统存储过程。

二、实验内容与要求
1、为sell_order表创建两个存储过程:prStoreOrderID可以插入一个订单并返回订单号,prStoreOrderItem可以插入订单项。

2、创建一个存储过程,该存储过程创建一个只有一个整型字段的临时表。

然后存储过程把从1~100的数插入表中,最后作为一个结果集返回给调用者。

3、创建一个名为prUpdateName的存储过程,并用它来更新表goods中指定记录的goods_name字段。

4、使用查询分析器获取存储过程prTest的源代码。

5、使用查询分析器将存储过程prTest重命名为npr_Test。

6、使用查询分析器删除存储过程sp_Test。

7、为DEPARTMENT表创建一个触发器,使得该表中的部门号发生变化时,EMPLOYEE表中相应记录的字段自动该表,并编写命令触发之。

三、实验要求
实验报告格式要求
1.实验目的
2.实验内容
3.实验过程
4.总结。

存储过程和触发器

存储过程和触发器
[ VARYING ] [ = default ] [ OUT[PUT] ]
][ ,...n ] [ WITH <procedure_option>] [ ,...n ]
[ FOR REPLICATION ] AS { <sql_statement> [;][ ...n ]
| EXTERNAL NAME asse MBly_name.class_name.method_name } [;]
【例7.7】 对例7.2中创建旳存储过程student_info1进行修改,将第一种参数改 成学生旳学号。
ON c.Leabharlann 程号= b.课程号WHERE 姓名 LIKE @name
GO
执行存储过程:
EXECUTE st_info
/*参数使用默认值*/
或者
EXECUTE st_info '王%'
/*传递给@name 旳实参为'王%'*/
(5)使用OUTPUT游标参数旳存储过程。OUTPUT游标参数用于返回存储过程 旳局部游标。
/*执行旳操作*/
| EXTERNAL NAME asse MBly_name.class_name.method_name }
[;]
其中,
<procedure_option> ::=
[ ENCRYPTION ]
[ RECOMPILE ]
2.存储过程旳执行
经过EXECUTE或EXEC命令能够执行一种已定义旳存储过程,EXEC是EXECUTE旳 简写。语法格式:
3.举例
(1)设计简朴旳存储过程。 【例7.1】 返回081101号学生旳成绩情况。该存储过程不使用任何参数。 USE PXSCJ GO CREATE PROCEDURE student_info

第7章 存储过程和触发器

第7章 存储过程和触发器

7.1.1 存储过程的类型
存储过程的类型:
系统存储过程: 已在系统数据库master中定义,可作为命令执行。 本地存储过程: 由用户在用户数据库中定义。 临时存储过程:
本地存储过程的一种,分为局部临时存储过程和全局临时 存储过程。
远程存储过程: 指从远程服务器上调用的存储过程。 扩展存储过程: 指在 SQL Server 环境之外的动态链接库,SQL Server 按照存储过程的方法执行。
(5) 如果一个表的外键在 DELETE、UPDATE 操作上定义了级联,则不能在该表 上定义 INSTEAD OF DELETE、INSTEAD OF UPDATE 触发器。
(7) 在触发器内可以指定任意的 SET 语句,所选择的 SET 选项在触发器执行期 间有效,并在触发器执行完后恢复到以前的设置。 (8) 触发器中不允许包含以下 T-SQL 语句:
调用存储过程的语法格式:
[ EXEC [ UTE ] ] { [ @return_status = ] { procedure_name [ ;number ] | @procedure_name_var } [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] } [ ,...n ] [ WITH RECOMPILE ] }
7 存储过程和触发器
7
7.1.2 用户存储过程的创建与执行
使用 WITH ENCRYPTION 选项(创建加密过程)举例 WITH ENCRYPTION 子句对用户隐藏(加密)存储过程的文本。 【例】使用 sp_helptext 系统存储过程获取关于加密过程的信息,然后尝试直接从 syscomments 表中获取关于该过程的信息。 USE XSCJ GO IF EXISTS (SELECT name FROM sysobjects WHERE name = 'encrypt_this' AND type = 'P') DROP PROCEDURE encrypt_this GO CREATE PROCEDURE encrypt_this WITH ENCRYPTION /*加密过程*/ AS SELECT * FROM XS GO 存储过程的调用: EXECUTE sp_helpyext encrypt_this /*系统存储过程sp_helpyext用于获取存储 过程的信息*/ 结果集为提示信息:对象备注已加密。

第7章 存储过程、触发器和程序包-4

第7章  存储过程、触发器和程序包-4

9
7.1.3 默认值
注意:只有IN参数才具有默认值,OUT和IN OUT参数 都不具有默认值。 在为参数定义默认值时,一般建议:将没有默认值的 参数放在参数列表的开始位置,其后是OUT类型的参 数,然后是IN OUT类型的参数,最后才是具有默认值 的IN参数。
10
7.1.4 过程中的事务处理
当在SQL*Plus中进行操作时,用户可以使用 COMMIT语句将在事务中的所有操作“保存”到数据库 中。如果用户需要撤销所有的操作,则可以使用 ROLLBACK语句回退事务中未提交的操作,使数据库返回 到事务处理开始前的状态。在PL/SQL过程中,不仅可以 包括插入和更新这类的DML操作,还可以包括事务处理 语句COMMIT和ROLLBACK。
7.3.3 行级触发器
在创建触发器时,如果使用了FOR EACH ROW选项, 则创建的该触发器为行级触发器。对于行级触发器而 言,当一个DML语句操作影响到数据库中的多行数据 时,行级触发器会针对于每一行执行一次。 重要特点 当创建BEFORE行级触发器时,可以在触发器中引用 受到影响的行值,甚至可以在触发器中设置它们。
26
7.4 程序包
程序包其实就是被组合在一起的相关对象的集合, 当程序包中任何函数或存储过程被调用时,程序包就被 加载入到内存中,这样程序包中的任何函数或存储过程 的子程序访问速度将大大加快。例如,在PL/SQL程序 中,为了输出运行结果,在程序的代码中使用了 DBMS_OUTPUT.PUT_LINE语句。事实上,这是调用程 序包DBMS_OUTPUT中的PUT_LINE过程。 DBMS_OUTPUT程序包的主要功能就是在PL/SQL程序 中进行输入和输出。 程序包由两个部分组成:规范和包主体。规范中描述程 序包所使用的变量、常量、游标和子程序,包主体完全 定义子程序和游标。 27
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

向table1中插入一行数据: INSERT INTO table1 VALUES(10); 输出结果: TRIGGER IS WORKING
【例7.9】 假设XSCJ数据库中增加一个新表XSB_HIS,表结构和表XSB相同,用 来存放从XSB表中删除的记录。创建一个触发器,当XSB表被删除一行,把删除的记 录写到日志表XSB_HIS中。 CREATE OR REPLACE TRIGGER del_xs BEFORE DELETE ON XSB FOR EACH ROW BEGIN INSERT INTO XSB_HIS (XH,XM, XB,CSSJ, ZY, ZXF,BZ) VALUES(:OLD.XH,:OLD.XM, :OLD.XB, :OLD.CSSJ, :OLD.ZY, :OLD.ZXF, :OLD.BZ); END;
2.调用存储过程 调用存储过程一般使用EXEC语句,但在PL/SQL块中可以直接使用存储过程的名 称来调用。 语法格式: [ { EXEC | EXECUTE } ] procedure_name * ( *parameter =>+ value | @variable *,…n+) + *;+ 【例7.4】 调用例7.1中的存储过程proc。 SET SERVEROUT ON; EXEC proc; 输出结果: hello world 以下命令运行的结果与之相同: BEGIN proc; END;
【例7.3】 计算某专业总学分大于40的人数,存储过程使用了一个输入参数和 一个输出参数。 CREATE OR REPLACE PROCEDURE count_grade ( zy IN char, person_num OUT number ) AS BEGIN SELECT COUNT(XH) INTO person_num FROM XSB WHERE ZY=zy AND ZXF>40; END;
在调用过程count_number时,需要先定义OUT类型参数,调用如下: DECLARE man_num number; BEGIN count_number('男', man_num); DBMS_OUTPUT.PUT_LINE(man_num); END; 输出结果: 12
3.利用OEM创建过程 如果要通过OEM定义一个存储过程count_grade查询XSCJ数据库中某个专业的学 生人数,步骤如下。 (1)在OEM界面的“方案”属性页中选择“过程”,单击鼠标左键,进入 “过程搜索”页面。 (2)单击“创建”按钮,进入“创建 过程”页面。在“名称”文本框中指定过程 名称count_grade;在“方案”中选择建立过 程的用户方案SYSTEM。然后在“源”代码 区域,编辑PL/SQL过程语句块,如图7.1所示。 (3)代码输入编辑完成后,单击“确 定”按钮完成过程创建。
【例7.5】 从XSCJ数据库的XSB表中查询某人的总学分,根据总学分写评语。 CREATE OR REPLACE PROCEDURE update_info ( xh in char ) AS xf number; BEGIN SELECT ZXF INTO xf FROM XSB WHERE XH=xh AND ROWNUM=1; IF xf>50 THEN UPDATE XSB SET BZ= '三好学生' WHERE XH=xh; END IF; IF xf<35 THEN UPDATE XSB SET BZ= '学分未修满' WHERE XH=xh; END IF; END; 执行存储过程update_info: EXEC update_info(xh=>'101101');
有关DML触发器,还有以下几点说明。 (1)创建触发器的限制。 (2)触发器触发次序。 (3)示例如下。 【例7.8】 创建一个表table1,其中只有一列a。在表上创建一个触发器,每次 插入操作时,将变量str的值设为“TRIGGER IS WORKING”并显示。 创建表table1: CREATE TABLE table1(a number); 创建INSERT触发器table1_insert CREATE OR REPLACE TRIGGER table1_insert AFTER INSERT ON table1 DECLARE str char(100) :='TRIGGER IS WORKING'; BEGIN DBMS_OUTPUT.PUT_LINE(str); END;

7.2.1 利用SQL语句创建触发器 创建触发器都使用CREATE TRIGGER语句,但创建DML触发器和替代触发器与创 建系统触发器的语法略有不同。 1.创建DML触发器 语法格式: CREATE [OR REPLACE] TRIGGER [schema.] trigger_name /*指定触发器名称*/ { BEFORE∣AFTER∣INSTEAD OF } , DELETE | INSERT | UPDATE * OF column,…n +/*定义触发器种类*/ *OR , DELETE | INSERT | UPDATE * OF column,…n +-+ ON [schema.] {table_name∣view_name} /*指定操作对象*/ [ FOR EACH ROW [ WHEN(condition) ] ] sql_statement*…n+ /*PL/SQL块*/
7.1 存ห้องสมุดไป่ตู้过程 7.2 触发器 7.3 事务 7.4 锁
使用存储过程的优点如下。 (1)过程在服务器端运行,执行速度快。 (2)过程执行一次后代码就驻留在高速缓冲存储器,在以后的操作中,只需 从高速缓冲存储器中调用已编译代码执行,提高了系统性能。 (3)确保数据库的安全。可以不授权用户直接访问应用程序中的一些表,而 是授权用户执行访问这些表的过程。非表的授权用户除非通过过程,否则就不能访 问这些表。 (4)自动完成需要预先执行的任务。过程可以在系统启动时自动执行,而不 必在系统启动后再进行手工操作,大大方便了用户的使用,可以自动完成一些需要 预先执行的任务。
修改存储过程和修改视图一样,虽然也有ALTER PROCEDURE语句,但是 它是用于重新编译或验证现有过程的。如果要修改过程定义,仍然使用 CREATE OR REPLACE PROCEDURE命令,语法格式一样。 其实,修改已有过程本质就是使用CREATE OR REPLEACE PROCEDURE重新 创建一个新的过程,保持名字和原来的相同。 使用界面方式也可很方便地修改存储过程定义。在OEM的“搜索过程” 页面中,搜索出要修改的存储过程,选中后单击“编辑”按钮,在“编辑 过程”页面中修改定义存储过程的PL/SQL语句,单击“应用”按钮就完成 修改了。
4.利用SQL Developer创建过程 如果要通过SQL Developer定义存储过程count_grade,步骤如下。 (1)启动SQL Developer,选择system_ora连接的Procedures节点,右击鼠标, 选择“New Procedure”菜单项进入“Create PL/SQL Procedure”对话框,如图7.2所 示。
当某个过程不再需要时,应将其删除,以释放它占用的内存资源。 语法格式: DROP PROCEDURE [schema.] procedure_name; 其中,schema是包含过程的用户;procedure_name是将要删除的存储过程名 称。 【例7.7】 删除XSCJ数据库中的count_number存储过程。 DROP PROCEDURE count_num;
1.SQL命令创建存储过程 创建存储过程的语句是CREATE PROCEDURE语句。 语法格式: CREATE [OR REPLACE] PROCEDURE [schema.]procedure_name /*定义过程名*/ * (parameter parameter_mode date_type * DEFAULT expr + *, …n+)+ /*定义参数 类型及属性*/ { IS | AS } [declare_section] /*变量声明部分*/ BEGIN sql_statement /*PL/SQL过程体*/ END [procedure_name][;]
【例7.1】 输出hello world。 CREATE PROCEDURE proc AS BEGIN DBMS_OUTPUT.PUT_LINE('hello world'); END; 【例7.2】 计算指定学生的总学分。 CREATE OR REPLACE PROCEDURE totalcredit ( xh IN varchar2) AS xf number; BEGIN SELECT ZXF INTO xf FROM XSB WHERE XH=xh AND ROWNUM=1; DBMS_OUTPUT.PUT_LINE(xf); END;
2.创建替代触发器 创建替代触发器使用INSTEAD OF关键字,一般用于对视图的DML触发。由于视 图有可能由多个表进行关联而成,因而并非所有的关联都是可更新的。INSTEAD OF 触发器触发时只执行触发器内部的SQL语句,而不执行激活该触发器的SQL语句。 例如,若在一个多表视图上定义了INSTEAD OF INSERT触发器,视图各列的值可 能允许为空也可能不允许为空。若视图某列的值不允许为空,则INSERT语句必须为 该列提供相应的值。 【例7.11】 在XSCJ数据库中创建视图stu_view,包含学生学号、专业、课程号、 成绩。该视图依赖于表XSB和CJB,是不可更新视图。可以在视图上创建INSTEAD OF 触发器,当向视图中插入数据时分别向表XSB和CJB插入数据,从而实现向视图插入 数据的功能。 首先创建视图: CREATE VIEW stu_view AS SELECT XSB.XH, ZY, KCH, CJ FROM XSB, CJB WHERE XSB.XH=CJB.XH
相关文档
最新文档