第7章 存储过程、触发器和用户自定义函数

第7章 存储过程、触发器和用户自定义函数
第7章 存储过程、触发器和用户自定义函数

第 7 章存储过程、触发器和用户自定义函数(6课时)

主要内容:

1 存储过程(概述、创建与执行、修改与删除)

2 触发器(概述、DML触发器、DDL触发器)

3 用户自定义函数(概述、标量函数的建立与调用、内嵌表值函数的建立与调用、多语名表值函数的建立与调用)

存储过程是一个可重用的代码模块,可以高效率地完成指定的操作。触发器是一种特殊类型的存储过程,可以实现自动化的操作。用户定义函数是由用户根据应用程序的需要而定义的可以完成特定操作的函数。

这三种数据库对象都可以通过两种方法来定义:

SQL Server Management Studio工具

命令

这里只讨论通过命令的方式定义相应对象。

7.1 存储过程

7.1.1 存储过程概述

1 存储过程概念

当使用SQL Server创建应用时,TRANSACT-SQL语言是应用程序与SQL Server数据库之间的主要编程接口。使用TRANSACT-SQL语言进行程序设计时,有两种方式:一种方式是在应用程序中直接使用T-SQL 语句向SQL Server发送命令;另一种方式就是使用存储过程。

存储过程是一种数据库对象,由一组预编译的T-SQL语句组成,这些语句在一个名称下存储,并作为一个单元进行处理。存储过程类似于其他编程语言中的函数或过程:能够使用传递给它的参数,能够调用其它存储过程甚至本身,能够返回一个状态码来表示是否成功执行。

在SQL Server 2008系统中,除了可以使用Transact-SQL语言编写存储过程外,也可以使用CLR方式编写存储过程。【CLR,公用语言运行时(Commen Language Runtime),.NET提供了一个运行时环境,它负责资源管理(内存分配和垃圾收集),并保证应用和底层操作之间必要的分离。是一种多语言执行环境,支持众多的数据类型和语言特性。他管理着代码的执行,并使开发过程变得更加简单。】

SQL Server中有三类存储过程:系统存储过程(sp_为前缀)、用户

自定义存储过程和扩展存储过程(xp_为前缀,扩展了SQL Server的功能,使得用户能调用外部例程(自已编写的程序或系统提供的命令),从SQL Server2005版本开始,将逐步删除扩展存储过程类型,因为使用CLR存储过程可以可靠和安全地替代扩展存储过程的功能)。

2 存储过程功能

在SQL Server中,存储过程是一种非常强有力的数据库对象,利用它能够显著提高应用程序的性能。主要功能表现在:

接收输入参数并以输出参数的形式为调用过程或批处理返回

多个值;

包含对数据库操作的多条语句,可以调用其他存储过程;

为调用存储过程或批处理返回一个状态值,以表示执行状

态。

3 存储过程的特点

模块化编程。一旦创建了一个存储过程,就可以在应用程序

中多次调用它,而且由于存储过程独立于应用程序,所以可

以在不影响应用程序源代码的前提下修改它。

加快执行速度。在创建一个存储过程时,SQL Server要对它

进行分析和优化,以获得最好的执行性能;当一个存储过程

被首次执行后,它就会驻留内存,当再次调用时,就不必再

加载了,从而提高了整个系统的执行速度。

减少网络通信量。使用存储过程,客户端的应用程序可以通

过一条简单的执行命令来执行存放在服务器端的存储过程,

而不必传输成百上千行的SQL语句代码,因此可以大大减少

网络阻塞。

提供安全机制。可以通过存储过程来间接将某些权限赋给用

户。

复杂业务规则和约束的一致性实现。存储过程足够强大,甚

至能够实现最复杂的业务规则,这是因为存储过程可以同时

合并过程语句和面向集合的语句。

4 存储过程的数据返回方式

存储过程可以通过四种方式把数据返回到调用处:

输出参数。既可以返回数据(数值型或字符值等),也可以返

回游标变量(游标是可以逐行检索的结果集)。

反回值。始终是整型值。

结果集。这些语句包含在该存储过程内或该存储过程所调用

的任何其它存储过程内。

全局游标。可从存储过程外引用的全局游标。

7.1.2 创建与执行存储过程

1 创建存储过程

简化语法:

CREATE PROCE[DURE] procedure_name

[{@parameter data_type}[=default][output]][,...n]

AS

sql_statement […n]

其中,@parameter data_type 存储过程参数表,可以定义输入参数(默认)、输出参数output(即可输入数据,也可输出数据),也可以指明参数的默认值,默认值必须是常量或NULL。参数表中可以有0个或多个参数,多个参数之间用豆号分开。【输入参数:允许调用程序为存储过程传送数据值。输出参数:输出参数允许存储过程将数据值或游标变量传回调用程序,在定义时和调用时均要使用OUTPUT关键字。当然,也可以将变量的值通过输出参数输入到存储过程中。】sql_statement 指定存储过程要执行的操作。

创建存储过程也要遵守一些规则,参见教材(p230-231)。

2 执行存储过程

在SQL Server 2008系统中,可以使用EXECUTE语句执行存储过程。简化语法:

[ { EXEC[UTE ]} ]

{

[ @return_status = ]

{ procedure_name }

[ [ @parameter = ] { value

| @variable [ OUTPUT ]

| [ DEFAULT ]

}

]

[ ,...n ]

}

如果要执行带有参数的存储过程,需要在执行过程中提供存储过程参数的值。如果使用@parameter_name=value语句提供参数值,可以不考虑存储过程的参数顺序,否则如果直接提供参数值,则必须考虑参数顺序。

存储过程创建之后,在第一次执行时需要经过语法分析阶段、解析阶段、编译阶段和执行阶段。

语法分析阶段。是指系统检查创建存储过程的语句的语法是否正确的过程。语法检查通过之后,系统将把存储过程的定义存储在当前数据库的sys.sql_modules目录视图中。

解析阶段。是指检查存储过程引用的对象名称是否存在的过程,该过程也被称为延迟称称解析阶段。当然,只有引用的表对象才适用于延迟名称解析。

编译阶段。是指分析存储过程和生成执行计划的过程。优化后的执行计划置于过程高速缓冲存储区中。

执行阶段。是指执行驻留在过程高速缓冲存储区中的存储过程执行计划的过程。

在以后的执行过程中,如果现有的执行计划依然驻留在过程高速缓冲存储区中,那么SQL Server将重用现有执行计划。

当存储过程引用的基表发生结构变化时,该存储过程的执行计划将会自动优化。但是当在表中添加了索引或更改了索引列中的数据后,该执行计划不会自动优化,此时应该重新编译存储过程。可以使用三种方式重新编译存储过程:

使用sp_recompile系统存储过程;

在EXECUTE语句中使用WITH RECOMPILE子句;

在CREATE PROCEDURE语句中使用WITH RECOMPILE子

句。

3 存储过程的创建与执行实例

例1:查找指定日期后签定的订单(创建有返回结果集的存储过程)use Northwind

go

if OBJECT_ID('p1','p')is not null

drop procedure p1

go

create procedure p1

@datex datetime

as

select*from orders where orderdate>=@datex

go

********************************************

use Northwind

execute p1'1997-1-1'

例2:求产品的平均单价(创建有返回参数的存储过程)

use Northwind

go

if OBJECT_ID('p2','p')is not null

drop procedure p1

go

create procedure p2

@avgprice money output

as

select@avgprice=avg(unitprice)from products

go

***********************************

use Northwind

declare@x money

execute p2@x output

select@x

例3:判断是否有1997年2月20号签定的订单,有返回0,没有返回1(创建有返回值的存储过程)

use Northwind

go

if OBJECT_ID('p3','p')is not null

drop procedure p1

go

create procedure p3

@datex datetime

as

if exists(select*from orders where

orderdate=@datex)

return 0

else

return 1

go

****************************************************

use Northwind

declare@x int

execute@x=p3'1997-2-20'

select@x

例4:根据最后姓名模糊查找职员信息(创建带有缺省值参数的存储过程)

use Northwind

go

if OBJECT_ID('p4','p')is not null

drop procedure p1

go

create procedure p4

@namex nvarchar(20)='D%'

as

select*from employees where lastname like

@namex+'%'

go

******************************************

use Northwind

execute p4

execute p4'B'

7.1.3 修改存储过程

在Microsoft SQL Server 2008系统中,可以使用ALTER PROCEDURE 语句修改已经存在的存储过程。修改存储过程,不是删除和重建存储过程,其目的是保持存储过程的权限不发生变化。简化语法如下:ALTER PROCE[DURE] procedure_name

[{@parameter data_type}[=default][output]][,...n]

AS

sql_statement […n]

7.1.4 删除存储过程

如果某个存储过程不再需要了,可以使用DROP PROCEDURE语句删除该存储过程。具体语法是:

DROP PROCEDURE procedure_name

7.2 触发器

7.2.1触发器概述

触发器是数据库服务器中发生事件时能自动执行的一种特种存储过程,主要用于强制规则和数据完整性。触发器是通过事件触发而自动执行的,不能被直接调用执行。

根据触发事件的不同,触发器分为两种类型。由DML触发的是DML 触发器,由DDL触发的是DDL触发器(DDL触发器是从SQL Server 2005版开始新增的,分为数据库级的DDL触发器和服务器级的DDL触发器)。

在SQL Server 2008系统中,除了可以使用Transact-SQL语言编写触发器外,也可以使用CLR方式编写触发器。

7.2.2 DML触发器

1 DML触发器概述

DML触发器是和数据库中的表相关的,当对表进行INSERT、UPDATE、DELETE操作时,将触发相应的触发器。在SQL Server中,按照触发器和触发事件的执行时间的先后顺序划分,有两类DML触发器,一类是标准(After)触发器,另一类是新的Instead-of触发器。

当触发事件(INSERT、UPDATE、DELETE)执行之后才执行触发器操作,这时的触发器类型是AFTER触发器。AFTER触发器只能在表上定义。如果想要使用触发器操作替代触发事件的操作,可以使用INSTEAD OF触发器。INSTEAD OF触发器可以建在表上,也可以建在视图上。

触发器的主要功能表现在:

强化约束。触发器能够实现比CHECK更为复杂的约束。

级联修改。当某张表中的数据发生变化时,通过触发器对与

之关联的表进行相应的更新。

实施数据完整性。使用触发器禁止或回滚违反数据完整性的

操作或其它不经许可的操作。

更新前后状态比较。触发器可以区对数据更新操作的前后状

态差别,并可以完成基于这种差别的特定动作。

对DML触发器的说明:

触发原因。每个修改语句(Insert、Update、Delete)都会引

发一次触发器的执行。甚至当修改语句影响了0条记录时也

会被引发。

触发时机。After触发器是在修改语句成功完成之后被引发,

而Instead-of触发器是在修改语句完成之前(Inserted和Deleted

表被建立之后),在所有约束之前被启动

视图触发器。对视图只能建立Instead-of触发器,不能建立

After触发器。

一个表的一个操作能定义多个AFTER触发器,根据定义的先

后顺序被触发,也可以通过sp_settriggerorder来改变触发顺

序。一个表或一个视图对于每种操作只能定义一个Instead-of

触发器。

2 DML触发器的定义

[1]DML触发器的创建

可以使用CREATE TRIGGER语句创建DML触发器。基本语法如下:CREATE TRIGGER trigger_name

ON {table_name | view}

{FOR | AFTER | INSTEAD OF}

{[INSERT][,][UPDATE][,][DELETE]}

AS

sql_statement[…n]

虽然在触发器中可以包括许多Transact-SQL语句,但仍有一些语句不能用在触发器中(参见教材p239)

创建触发器时,有关触发器的信息就记录在sys.triggers对象目录视图、sys.trigger_events对象目录视图以及sys.sql_modules目录视图中。可以使用sp_helptext系统存储过程查看触发器的定义信息。

例1:在employees表上创建一个delete触发器,显示被删除员工的个数信息。

use Northwind

go

if exists(select*from sys.triggers where

name='tr_employee')

drop trigger dbo.tr_employee

go

CREATE TRIGGER tr_employee ON employees

AFTER DELETE

AS

DECLARE@msg varchar(50)

SELECT@msg=STR(@@ROWCOUNT)+'were deleted'

SELECT@msg

RETURN

go

*************************************************

use Northwind

go

insert into dbo.Employees(LastName,FirstName) values('aa','xx')

insert into dbo.Employees(LastName,FirstName) values('bb','yy')

go

delete from dbo.Employees where EmployeeID>=10 go

例2:当用户向a表插入数据时,b表也插入一条记录。

use mydb

go

if OBJECT_ID('a')is not null

drop table a

go

create table a

(a1char(5)primary key,

a2varchar(20)

)

go

if OBJECT_ID('b')is not null

drop table b

go

create table b

(b1int identity(1,1)primary key, b2varchar(20)

)

go

if exists(select*from sys.triggers where name='tr_1')

drop trigger dbo.tr_1

go

CREATE TRIGGER tr_1ON a

AFTER insert

as

insert into b(b2)values('xx')

go

**************************************

use mydb

go

insert into a values('1001','dddd')

insert into a values('1002','eeeeee')

insert into a values('1003','cccc')

go

************************************

select*from b

例3:根据上例所建立的a表,建立一个INSTEAD OF触发器,当删除记录时,显示提示信息而不进行删除操作。

use mydb

go

if exists(select*from sys.triggers where

name='tr_2')

drop trigger dbo.tr_2

go

CREATE TRIGGER tr_2ON a

instead of delete

as

print'不能删除'

go

***************************************

use mydb

go

delete from a where a1='1000'

go

************************************

select*from a

[2]inserted和deleted虚拟表

在触发器的执行过程中,SQL Server要维护两个临时的虚拟表:inserted和deleted。Inserted表包含引发触发器操作过程中被插入的所有记录,deleted表包含引发触发器操作过程中被删除的所有记录(update 操作可理解为先删除,后插入)。

向表中插入数据时,insert触发器触发执行,新插入的记录加到

inserted表中。Inserted表是一个逻辑表,保存所插入记录的备份,允许用户参考新插入的数据。在inserted表中的记录总是触发器表中的一行或多行记录的冗余。

从表中删除数据时,delete触发器触发执行,被删除的数据放在deleted表中。Deleted表是一个罗辑表,保存已经从表中删除的记录。当删除的记录放入deleted 表中时,该记录就不会存在触发器表中了。

修改一条记录等于删除一条旧记录的同时插入一条新记录。也就是表中原来的记录移动到deleted表中,修改过的记录插入到了inserted表中。

Transact-SQL语句Inserted表Deleted表

INSERT新添加的行空(N/A)

UPDATE新行旧行

DELETE空被删除的行例4:验证insert操作中的两个虚表。

use mydb

go

if exists(select*from sys.triggers where

name='test_insert')

drop trigger dbo.test_insert

go

create trigger test_insert

on a

for insert

as

select*from inserted

select*from deleted

select*from a

go

****************************************

insert into a values('1002','2222222')

例3:验证delete操作中的两个虚表。

use mydb

go

if exists(select*from sys.triggers where

name='test_delete')

drop trigger dbo.test_delete

go

create trigger test_delete

on a

for delete

as

select*from inserted

select*from deleted

select*from a

go

**********************************************

delete from a where a1='1001'

例4:验证update操作中的两个虚表。

use mydb

go

if exists(select*from sys.triggers where

name='test_update')

drop trigger dbo.test_update

go

create trigger test_update

on a

for update

as

select*from inserted

select*from deleted

select*from a

go

******************************************

update a set a2='vvvvvv'where a1='1002'

[3]修改触发器

DML触发器是可以修改的,使用ALTER TRIGGER完成修改操作。

[4]禁用和删除触发器

通过DISABLE TRIGGER trigger_name ON table_name命令或ALTER TABLE table_name DISABLE TRIGGER trigger_name来禁用触发器;通过ENABLE TRIGGER trigger_name ON table_name命令或ALTER

TABLE table_name ENABLE TRIGGER trigger_name来禁用触发器DML触发器是可以删除的,使用DROP TRIGGER完成修改操作。7.2.3 DDL触发器

1 DDL触发器概述

DDL触发器是一种特殊的触发器,它在响应数据定义语言(DDL)语句时触发,可以用于在数据库中执行管理任务。触发事件主要是CREATE、ALTER、DROP等语句,并且触发的时间只有AFTER。

一般地,DDL触发器主要用于下面这些操作:

防止对数据库架构进行某些更改;

希望数据库中发生某种情况以实现相应数据库架构中的更

改;

记录数据库架构中的更改或事件。

DDL触发器有服务器级的和数据库级的两种。我们可以为服务器级的事件定义服务器级DDL触发器,如创建数据库、更改登录等。数据库级触发器可以响应数据库级事件,如创建、修改或删除对象等。

2 DDL触发器定义

DDL触发器的定义和DML触发器的定义相似,包括创建、修改和删除操作。这里只讨论创建操作。

简化语法:

CREATE TRIGGER trigger_name

ON {ALL SERVER | DATABASE}

[WITH ENCRYPTION]

{ FOR | AFTER}{event_type}

AS

Sql_statement

其中,

ALL SERVER关键字表示该DDL触发器的作用域是整个服务器,即服务器级DDL触发器。

DATABASE关键字表示该DDL触发器的作用域是整个数据库,即数据库级DDL触发器。

event_type参数用于指定触发事件,数据库范围内的事件请参见教材(p247),服务器范围内的事件请参见孝材(p248)。

例5:防止删除或修改表的数据库级DDL触发器。

use mydb

go

if exists(select*from sys.triggers where

name='test_ddltrigger')

drop trigger test_ddltrigger on database

go

create trigger test_ddltrigger

on database

for drop_table,alter_table

as

print N'禁止删除或修改当前数据库中的表'

rollback

go

例6:建立服务级存储过程,当创建数据库时显示信息。

IF EXISTS(SELECT*FROM sys.server_triggers

WHERE name='ddl_trig_database')

DROP TRIGGER ddl_trig_database

ON ALL SERVER;

GO

CREATE TRIGGER ddl_trig_database

ON ALL SERVER

FOR CREATE_DATABASE

AS

PRINT'Database Created.'

SELECT

EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText) [1]','nvarchar(max)')—该函数用业捕获有关激发DDL触发器的事

件信息

GO

修改DDL触发器使用ALTER TRIGGER命令。

删除DDL触发器使用DROP TRIGGER命令,具体语法如下:

DROP TRIGGER trigger_name [ ,...n ] ON { DATABASE | ALL SERVER }

禁用DDL触发器的命令如下:

DISABLE TRIGGER { [ schema_name . ] trigger_name [ ,...n ] | ALL }

ON { object_name | DATABASE | ALL SERVER }

启用DDL触发器的命令如下:

ENABLE TRIGGER { [ schema_name . ] trigger_name [ ,...n ] | ALL }

ON { object_name | DATABASE | ALL SERVER }

7.3 用户自定义函数

7.3.1 用户自定义函数概述

用户自定义函数是用于封装经常执行的逻辑的子例程。任何代码想要执行函数所包含的逻辑,都可以调用该函数,而不必重复所有的函数逻辑。用户定义函数接受零个或多个输入参数,并返回单值,可以是单个标题值,也可以是table类型的值。输入参数可以是除timestamp,cursor和table类型之外的任何数据类型。返回值可以是除timestamp,cursor,text,ntext和image类型之外的任何数据类型。

使用用户定义函数可以带来许多好处:

实现模块化设计;

可以独立于源代码进行修改;

加快执行速度;

减少网络流量。

用户自定义函数可以在选择和赋值语句中使用;可以用作选择条件的一部分;可以在表达式中使用;可以作为check约束和default约束;表值函数可以用在T-SQL语句中任何期望使用表的地方。

用户定义函数可以使用Transact-SQL语言编写,也可以使用.NET编程语言来编写。

在SQL Server中,用户定义函数分为两类,即用户定义标量函数和用户定义表值函数。用户定义标量函数只返回单个数据值。用户定义表值函数返回table类型数据,又分为内嵌表值函数和多语句表值函数。

7.3.2 标量函数的建立与调用

简化语法如下:

CREATE FUNCTION [ owner_name.] function_name

( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )

RETURNS scalar_return_data_type

[ WITH < function_option> [ [,] ...n] ]

[ AS ]

BEGIN

function_body

RETURN scalar_expression

END

在可使用标量表达式的位置可唤醒调用标量值函数,包括计算列和CHECK 约束定义。当唤醒调用标量值函数时,至少应使用函数的两部分名称。

[database_name.]schema_name.function_name ([argument_expr][,...])例1:编写函数,判断一个整数的奇偶性,偶数返回0,奇数返回1。use mydb

go

if OBJECT_ID('f1')is not null

drop function f1

go

create function f1(@m int)

returns int--偶数返回,奇数返回

as

begin

declare@x int

if@m%2=0

set@x=0

else

set@x=1

return@x--最后一条语句必须是return

end

************************************************

select dbo.f1(9)--调用时,必须指明架构,括号不能省略例2:编写一个求1+2+3+…+n的和的函数

use mydb

go

if OBJECT_ID('f2')is not null

drop function f2

go

create function f2(@n int)

returns int

as

begin

declare@sum int

declare@i int

set@sum=0

set@i=1

while@i<=@n

begin

set@sum=@sum+@i

set@i=@i+1

end

return@sum

end

*******************************************************

select dbo.f2(10)

例3:编写函数完成两个字符串的连接运算,要求结果串取第一个字符串的前四个字符,取第二个字符串的后四个字符。

use mydb

go

if OBJECT_ID('f3')is not null

drop function f3

go

create function f3(@str1nvarchar(100),@str2 nvarchar(100))

returns nchar(8)

as

begin

return left(@str1,4)+right(@str2,4)

end

****************************************************

select dbo.f3('abcdefg','1234567')

7.3.3 内嵌表值函数的建立与调用

也叫内联用户定义的表值函数,是一种特殊类型的用户自定义的表值函数,它的目的是实现参数化的视图。

简化语法:

CREATE FUNCTION [ owner_name.] function_name

( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )

RETURNS TABLE

[ WITH < function_option > [ [,] ...n ] ]

[ AS ]

RETURN [ ( ] select-stmt [ ) ]

函数不必定义返回值的格式,只要指定Table关键字就足够了。在return子句中,一个select语句创建一个结果集。

可以使用由一部分组成的名称唤醒调用表值函数。

[database_name.][owner_name.]function_name ([argument_expr] [,...])

例4:例1:编写函数查询指定年份的订单信息。

use northwind

go

if OBJECT_ID('f4')is not null

drop function f4

go

create function f4(@year int)

returns table

as

return select*from orders where year(orderdate)=@year

********************************************************** select*from f4(1996)

7.3.4多语句表值函数的建立与调用

可以在使用表(或视图)的地方使用用户自定义的表值函数,从这个方面来说,用户自定义的表值函数实现了视图的功能,可以带参数,是动态的。

简化语法:

CREATE FUNCTION [ owner_name.] function_name

( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )

RETURNS @return_variable TABLE < table_type_definition >

[ WITH < function_option > [ [,] ...n ] ]

[ AS ]

BEGIN

function_body

RETURN

END

可以使用由一部分组成的名称唤醒调用表值函数。

[database_name.][owner_name.]function_name ([argument_expr] [,...])

例5:编写函数,将一个整数拆分成2的幂的和。

use mydb

go

if OBJECT_ID('f5')is not null

drop function f5

go

create function[dbo].f5(@M integer)

returns@tableX table(X int not null)

as

begin

declare@x as int

set@x=1

while@x<=@m

begin

if@m&@x=@x

insert into@tableX values(@x)

set@x=@x*2

end

return--不能省略

end

******************************************************

select*from f5(15)

多语句表值函数和内联用户自定义的表值函数的区别:

1)多语句表值函数在returns子句中定义了一个表变量,并定义了结构

2)在函数体中存在填充表变量内容的语句

3)函数末尾必须有一个空的return语句

2.1 XXX

存储过程与触发器实验

第一章存储过程与触发器实验 实验目的 1.理解存储过程的工作原理和作用。 2.掌握存储过程设置和程序设计过程。 3.理解触发器的工作原理和作用。 4.掌握触发器编写方法。 实验环境 采用IBM DB2或Sybase数据库管理系统作为实验平台。其中,DB2可以采用DB2 Express-C或DB2 V8 Enterprise。 实验完成人:李肇臻,谢锦 实验内容 一、存储过程实验 1.针对下面2个完整性约束条件,建立存储过程,实现当数据导入或更新时,可以自动修改拥塞率、半速率话务量比例 (1)拥塞率=拥塞数量/呼叫数量 (2)半速率话务量比例=半速率话务量/全速率话务量 在DB2CMD中运行,win7用管理员权限。 create procedure M() language SQL begin update CALLDATA set "callcongs"="congsnum"/"callnum" where "congsnum"<>0 and "callnum"<>0; update CALLDATA set "rate"="thtraff"/"traff" where "thtraff"<>0 and "traff"<>0; end @ 2.将存储过程添加到数据库服务器上

3.在客户端编写调用存储过程的主程序 4.运行客户端程序,调用存储过程,观察存储过程执行过程和数据更新情况;调用就用db2 CALL M() 二、触发器实验 1. 针对下列约束条件,分别建立1个触发器: 1)每个小区/扇区最多占用14个TCH频点,合法频点范围在[1,60]之间。当向小区中新加入频点时,如果小区中现有频点数目已达到14个,则用新加入的频点替换现有频点中的最小频点;当修改或新加入频点时,如果发现频点不在合法范围内,则输出提示信息,并拒绝该操作。 create trigger first_1 after insert on FREQUENCY

存储过程和触发器(数据库实验5)

数据库基础与实践实验报告实验五存储过程和触发器 班级:惠普测试142 学号:1408090213 姓名:闫伟明 日期:2016-11-14

1 实验目的: 1)掌握SQL进行存储过程创建和调用的方法; 2)掌握SQL进行触发器定义的方法,理解触发器的工作原理; 3)掌握触发器禁用和重新启用的方法。 2 实验平台: 操作系统:Windows xp。 实验环境:SQL Server 2000以上版本。 3 实验内容与步骤 利用实验一创建的sch_id数据库完成下列实验内容。 1.创建存储过程JSXX_PROC,调用该存储过程时可显示各任课教师姓名及其所教课程名称。 存储过程定义代码: CREATE PROCEDURE JSXX_PROC AS SELECT tn 教师姓名,cn 所教课程FROM T,TC,C WHERE T.tno=TC.tno AND https://www.360docs.net/doc/395292732.html,o=https://www.360docs.net/doc/395292732.html,o 存储过程执行语句与执行结果截图: EXECUTE JSXX_PROC 2.创建存储过程XM_PROC,该存储过程可根据输入参数(学生姓名)查询并显示该学生的学号、 所学课程名称和成绩;如果没有该姓名学生,则提示“无该姓名的同学”。 存储过程定义代码:

CREATE PROCEDURE XM_PROC @sname VARCHAR(100) AS BEGIN IF EXISTS(SELECT NULL FROM S WHERE sn=@sname) SELECT S.sno 学号,cn 课程,score 成绩FROM S,SC,C WHERE https://www.360docs.net/doc/395292732.html,o=https://www.360docs.net/doc/395292732.html,o AND SC.sno=S.sno AND S.sn=@sname ELSE PRINT'无该姓名的同学。' END 运行截图: 3.创建存储过程XBNL_PROC,该存储过程可根据输入参数(专业名词,默认值为计算机专业), 统计并显示该专业各年龄段男、女生人数。如果没有该专业,则显示“无此专业”。 存储过程定义代码: CREATE PROCEDURE XBNL_PROC @departName VARCHAR(30)='计算机', @begin INT, @end INT AS

origin用户自定义拟合函数(优选.)

最新文件---------------- 仅供参考--------------------已改成-----------word文本 --------------------- 方便更改 赠人玫瑰,手留余香。 Origin 是一款科研和工程领域颇受欢迎的数据分析和绘图软件(A Date Analysis and Graphing Software)。 在数据分析功能中,它包涵了峰形分析、曲线拟合、统计、信号处理等功能。在曲 线拟合功能中,用户可以使用Origin自带的内置函数(Built-in Function),然而自带 函数不一定满足实际需要,用户还可以根据实际需求自定义拟合函数,并使之进行特 殊形态曲线的拟合,得到用户自己关心的曲线参数。 比如在介电材料的阻抗谱研究中,想知道Cole-Cole半圆与实部的两个交点,那么 就需要知道这个半圆的方程,从而解出想要的参数。 这里以半圆形曲线拟合为例简单介绍用户自定义拟合函数(User Defined Fitting Function)的建立和使用。 建立用户自定义函数的步骤: 1.选择 Tools: Fitting Function Organizer (快捷键F9) ,打开 Fitting function organizer. 单击 New Category 按钮,创建一个函数类,可以根据自己需要重命名,比如 My functions.然后单击 New Function,在这个类下面创建一个新的函数,然后命名,比如Semi-circle function:

2. 对该函数进行简短的描述,定义函数所需参数,输入函数方程。然后,进行最最关键的一步:函数编译!

实验六 存储过程和触发器

实验六存储过程与触发器 一、目的与要求 1.掌握编写数据库存储过程的方法。 2.掌握建立数据库触发器的方法,通过实验观察触发器的作用与触发条件设置 等相关操作。 二、实验准备 1.了解编写存储过程与调用的T-SQL语法; 2.了解触发器的作用; 3.了解编写触发器的T-SQL语法。 三、实验内容 (一)存储过程 在studentdb数据库中建立存储过程getPractice,查询指定院系(名称)(作为存储过程的输入参数)中参与“实践”课程学习的所有学生学号、姓名、所学课程编号与课程名称,若院系不存在,返回提示信息。 提示:D_Info表中存储了院系代码D_ID,而St_Info表中学号字段St_ID的前两位与之对应,则D_Info表与St_Info表之间的联系通过这两个字段的运算构成连接条件。 1.分别执行存储过程getPractice,查询“法学院”与“材料科学与工程学院” 的学生中参与“实践”课程的所有学生学号、姓名、所学课程编号与课程名称。 create procedure getPractice @D_Name varchar(30) output as begin if not exists (select * from D_Info where D_Name= @D_Name ) print '对不起,该院系不存在' else select st_info、St_ID,C_Info、C_No,C_Name from s_c_info inner join st_info on st_info、St_ID=s_c_info、st_id inner join C_Info on s_c_info、c_no=C_Info、C_No where st_info、St_ID in ( select St_ID from st_info join D_Info on D_Info、D_ID =left(st_info、St_ID,2) where C_Info、C_Type='实践' and D_Info、D_Name= @D_Name ) end go

Origin8.0用户自定义拟合函数的建立和使用

本帖包括两个话题:1. 自定义函数的建立 2. 自定义函数的调用。 为什么要建立自定义函数? 如果你没遇到这个问题,没想过这个问题,说明你origin还用得不够,你还只停留在数据绘图的层面上,数据分析功能还值得再拓展。 Origin 是一款科研和工程领域颇受欢迎的数据分析和绘图软件(A Date Analysis and Graphing Software)。 在数据分析功能中,它包涵了峰形分析、曲线拟合、统计、信号处理等功能。在曲线拟合功能中,用户可以使用Origin自带的内置函数(Built-in Function),然而自带函数不一定满足实际需要,用户还可以根据实际需求自定义拟合函数,并使之进行特殊形态曲线的拟合,得到用户自己关心的曲线参数。 比如在介电材料的阻抗谱研究中,想知道Cole-Cole半圆与实部的两个交点,那么就需要知道这个半圆的方程,从而解出相关参数。 这里以半圆形曲线拟合为例简单介绍用户自定义拟合函数(User Defined Fitting Function)的建立和使用。 一、建立用户自定义函数的步骤: 1.选择 Tools: Fitting Function Organizer (快捷键F9) ,打开 Fitting function organizer. 单击New Category 按钮,创建一个函数类,可以根据自己需要重命名,比如 My functions.然后单击 New Function,在这个类下面创建一个新的函数,然后命名,比如 Semi-circle function: 2. 对该函数进行简短的描述,定义函数所需参数,输入函数方程。然后,进行最最关键的一步:函数编译!

存储过程与触发器 实验报告

信息工程学院实验报告 课程名称:《数据库原理》 实验项目名称:存储过程与触发器 一、实验目的: (1)了解存储过程的概念 (2)掌握创建、执行存储过程的方法 (3)了解查看、修改和删除存储过程的方法 (4)了解触发器的概念 (5)掌握创建触发器的方法 (6)掌握查看、修改、删除触发器信息的方法 二、实验设备与器件 Win7 +Sql server 2008 三、实验内容与步骤 (一)存储过程 运行实验四附录中的SQL语句,准备实验数据。然后创建下列存储过程,并调试运行存储过程,查看运行结果。 1.在企业管理器中创建一个名为StuInfo的存储过程,完成的功能是在student表中查询系号为D2的学号、姓名、性别、年龄、系号的内容。 CREATE PROCEDURE StuInfo AS SELECT SNO AS学号, SNAME AS姓名, SSEX AS性别, SAGE AS年龄, DNO AS系号 FROM student WHERE DNO='D2' 结果: stuinfo 2.使用T_SQL语句创建存储过程,完成的功能是在表student,course和study中查询以下字段:学号、姓名、性别、课程名称、考试分数。

use mydb --查询是否已存在此存储过程,如果存在,就删除它 if exists(select name from sysobjects where name='StuScoreInfo'and type='P') drop procedure StuScoreInfo go --创建存储过程 CREATE PROCEDURE StuScoreInfo as select student.sno as学号, sname as姓名, ssex as性别, https://www.360docs.net/doc/395292732.html,ame as课程名称, study.grade as考试分数 from student,course,study where student.sno=study.sno and https://www.360docs.net/doc/395292732.html,o=https://www.360docs.net/doc/395292732.html,o 结果: StuScoreInfo 3.使用T_SQL语句创建一个带有参数的存储过程stu_sno_info,该存储过程根据传入的学生编号,在student表中查询此学生的信息。 if exists(select name from sysobjects where name='stu_info'and type='P') drop procedure stu_info go --创建存储过程 create procedure stu_info @sno varchar(8) as select sno as学号, sname as姓名, ssex as性别, sage as年龄, dno as年级

实验五:触发器和存储过程

实验五:触发器和存储过程 一.实验目的:理解触发器和存储过程的含义,掌握用SQL语句实现触发器和存储过程的编写,并初步掌握什么情况下使用事务。 二.实验内容: 有一个小型的图书管理数据库,包含的表为: bookstore(bookid,bookname,bookauthor,purchasedate,state);--图书库存表 borrowcard(cardid,ownername);--借书证表 borrowlog(cardid,bookid,borrowdate,returndate);--借书记录表 写一个存储过程,实现借书操作,要求有事务处理。(1)读者借书,要先设置书籍不在库标志state(借出),然后增加借书记录,在同一事务中完成。(2)要求在事务执行过程中引入错误触发事件,以此体会事务的错误保护机制和事务编程的作用。(3)要求用触发器实现表的完整性控制。 三、操作与运行 1.创建图书数据库: create table bookstore (bookid int not null primary key, bookname char(20), bookauthor char(20),

purchasedate datetime, state char(4) ) create table borrowcard (cardid int not null primary key, ownername char(20) ) create table borrowlog (cardid int not null, bookid int not null, borrowdate datetime, returndate datetime, primary key(cardid,bookid), ---foreign key(cardid)references borrowcard(cardid), ---foreign key(bookid)references bookstore(bookid) ) 通过以上语句,可以看到数据库中的表建立成功。 2.创建存储过程: create proc book_borrow @mycardid_in int, @mybookid_in int, @str_out char(30) output

存储过程与用户自定义函数

实验报告 课程名称:数据库系统概论实验时间:2012.5.10 学号:姓名:班级: 一、实验题目:存储过程与用户自定义函数 二、实验目的: 1)掌握SQLServer中存储过程的使用方法。 2)掌握SQLServer中用户自定义函数的使用方法。 三、实验内容:(记录每个实验步骤内容、命令、截屏结果) (一)存储过程 1、对学生课程数据库,编写2个存储过程,分别完成下面功能: 1)统计某一门课的成绩分布情况,即按照各分数段统计人数,要求使用游标。 create proc TotalByCnoNum ( @cno varchar(6) ) as begin declare @num1 int,@num2 int, @num3 int,@num4 int,@num5 int,@grade int,@cname char(20) select @num1=0,@num2=0,@num3=0,@num4=0,@num5=0 declare cur_cno cursor for select grade from sc where cno=@cno open cur_cno fetch next from cur_cno into @grade while@@fetch_status=0 begin if @grade between 90 and 100 set @num1=@num1+1 else if @grade between 80 and 89 set @num2=@num2+1 else if @grade between 70 and 79 set @num3=@num3+1 else if @grade between 60 and 69 set @num4=@num4+1 else set @num5=@num5+1 fetch next from cur_cno into @grade end close cur_cno deallocate cur_cno select @cname=cname from course where cno=@cno print'课程:'+@cname print'分数段人数统计'

数据库原理课程设计报告报告实验创建存储过程与触发器

存储过程与触发器实验日期和时间: 2016 年 5 月13 日、星 期 五第节 实验室:DJ2-信息管理实验室 班级:学号:姓名: 实验环境: 1.硬件:笔记本电脑 2.软件:SQL Server 2012 实验原理: 存储过程概念:存储过程是事先编好的,存储在数据库中的一组被编译了的T-SQL命令集合,这些命令用来完成对数据库的指定操作。存储过程可以接受用户的输入参数、向客户端返回表格或标量结果和消息、调用数据定义语言(DDL)和数据操作语言(DML)语句,然后返回输入参数。 触发器概念:触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 实验任务: 此作业成绩得分根据你完成的任务的难度和数量评分,完成后在实验室给老师演示验收,课后提交电子版报告。如额外完成自拟题目应当事先将所拟题目提交给老师或在报告中明确标注题意。 假定有学校的图书馆管理信息系统,可以用于日常管理书库和同学们的借还书工作。 以下列出参考的库表情况: 根据管理的业务需求来分析,该管理信息系统的数据库应至少包括如下数据表:(打★号的是必须有的表) 1.★图书现有库存表。作用:记录图书的现有库存情况。至少包括:书号、书名、 作者、简介、类别、价格、出版社、出版日期、现有库存数量、最小库存量、库 存总量、库存位置等。 2.★读者信息表。作用:记录读者信息。至少包括:读者编号、证件类型、证件号 码、姓名、性别、职业(可填写教师、学生、教工、其它……)、所属单位、地址、 联系电话等。 3.★借书记录表。作用:记录借书情况,以及是否归还。至少包括:借阅ID(主键, 可设置为自动编号)、书号、读者编号、借阅数量、借阅日期、是否归还、管理员 编号……等。 4.★还书记录表。作用:记录还书情况。至少包括:还书ID(主键,可设置为自动 编号)、书号、读者编号、归还数量、归还日期、是否超期(超过假设45天为超 期)、超期天数、管理员编号……等。(附:为简化操作,续借可视为归还后再借)。 5.管理员信息表。作用:记录负责管理书库和借书还书工作的管理员信息。至少包 括:管理员编号、职工编号(在职工档案表中的职工编号)、用户名、密码、管理

数据库存储过程与触发器实验报告

南昌航空大学实验报告 二00 年月日 课程名称:数据库概论实验名称:数据库存储过程与触发器 班级:122031 姓名:同组人: 指导教师评定:签名: 一、实验环境 1.Windows2000或以上版本; 2.SQLServer 2005。 二、实验目的 熟悉不同数据库的存储过程和触发器,重点实践SQL Server2005,掌握SQL Server2005中有存储过程与触发器的相关知识。 三、实验要求 完成实验指导书中p115-7和p132 -4。 四、实验步骤及参考源代码 1.创建与执行存储过程 create procedure C_P_Proc as select distinct https://www.360docs.net/doc/395292732.html,o,cna,pna,num from paper,customer,cp where https://www.360docs.net/doc/395292732.html,o=https://www.360docs.net/doc/395292732.html,o and paper.pno=cp.pno and cna='李涛' or cna='钱金浩' go execute C_P_Proc 2.删除存储过程 drop procedure C_P_Proc 3.创建插入触发器 create trigger TR_PAPER_I ON PAKER12203125 FOR INSERT AS DECLARE @appr float DECLARE @apno int SELECT @appr=ppr,@apno=pno from inserted begin if @appr<0 or @appr is null begin

raiserror('报纸的单价为空或小于!',16,1) update paper set ppr=10 where paper.pno=@apno end end 4.创建删除触发器 create Trigger TR_PAPER_D on PAKER12203125 after delete as declare @ipno char(6) declare @icount int; select @icount= count(*) from deleted,cp where deleted.pno=cp.pno if @icount>=1 begin select @ipno=pno from deleted raiserror('级联删除cp表中的数据',16,1) delete from cp where cp.pno=@ipno end 5.创建修改触发器 create trigger TR_PAPER_U ON PAKER12203125 for update as declare @ippr float select @ippr=ppr from inserted if @ippr<0 or @ippr is null begin raiserror('输入单价不正确',16,1) rollback transaction end 6. 分别对PAKER12203125表进行插入、修改、删除操作 insert into PAKER12203125 (pno,pna,ppr)values('000006','江西日报','1') insert into PAKER12203125 (pno,pna,ppr)values('000007','江南都市报','15.5') delete from PAKER12203125 where pno='000001' update PAKER12203125 set ppr=12.5 where pno='000002' update PAKER12203125 set ppr=-2 where pno='000004' 五、实验结果

第6章_存储过程与触发器练习题

有教师表(教师号,教师名,职称,基本工资),其中基本工资的取值与教师职称有关。实现这个约束的可行方案是( )。 A 在教师表上定义一个视图 B 在教师表上定义一个存储过程 C 在教师表上定义插入和修改操作的触发器 D 在教师表上定义一个标量函数 参考答案 C 在SQL SERVER中,执行带参数的过程,正确的方法为()。 A 过程名参数 B 过程名(参数) C 过程名=参数 D ABC均可 参考答案 A 在SQL SERVER服务器上,存储过程是一组预先定义并()的Transact-SQL语句。 A 保存 B 解释 C 编译 D 编写 参考答案 C 在SQL Server中,触发器不具有()类型。 A INSERT触发器 B UPDATE触发器 C DELETE触发器 D SELECT触发器 参考答案 D

()允许用户定义一组操作,这些操作通过对指定的表进行删除、插入和更新命令来执行或触发。 A 存储过程 B 规则 C 触发器 D 索引 参考答案 C 为了使用输出参数,需要在CREATE PROCEDURE语句中指定关键字( )。 A OPTION B OUTPUT C CHECK D DEFAULT 参考答案 B 下列( )语句用于创建触发器。 A CREATE PROCEDURE B CREATE TRIGGER C ALTER TRIGGER D DROP TRIGGER 参考答案 B 下列( )语句用于删除触发器。 A CREATE PROCEDURE B CREATE TRIGGER C ALTER TRIGGER D DROP TRIGGER 参考答案 D

实验八 存储过程和触发器_参考答案

实验八存储过程和触发器 一、目的与要求 1. 正确理解存储过程和触发器的概念、功能和类型; 2. 掌握使用SSMS和T-SQL语句创建和管理存储过程和触发器。 二、上机准备 利用教师提供的XSGL数据库,该库中有3个表:student,course,sc。 三、实验内容 1. 将教师提供的XSGL数据库附加到本地数据库中。 2. 分别使用SSMS和T-SQL语句创建和管理存储过程和触发器。 (1)创建一个存储过程proc_stud_sc_info,查询学号、姓名、性别、系、课程号和成绩等信息。 use xsgl go create procedure proc_stud_sc_info as select student.sno,sname,sex,dept,cno,grade from student left join sc on student.sno=sc.sno go (2)创建一个存储过程proc_stud_info,根据输入的学号,查询学生的基本信息。 use xsgl go create procedure proc_stud_info @sno char(5)='95001' as select * from student where sno=@sno go (3)创建一个存储过程proc_stud_birth_year,根据输入的学生姓名,计算该学生的出生年份。 use xsgl go create procedure proc_stud_birth_year @sname varchar(6)='张立' as select sname,year(getdate())-age as 出生年份 from student where sname=@sname go

函数与用户自定义函数.doc

函数 在Transact - SQL语言中,函数被用来执行一些特殊的运算以支持SQL Server的标准命令。 (1 )?行集函数:行集函数可以在transact?SQL语句中当作表引用。 (2).聚合函数:用于一组值执行计算并返回一个单一的值。 (3 ).标量函数:用于对传递给它的一个或者多个参数值进行处理和计算,并返回一个单一的值. (一)、标量函数的分类 1 ?配置函数:返回当前的配置信息 2 ?游标函数:返回有关游标的信息 3 ?日期和时间函数:用于对日期和时间类型的输入值进行操作,返回一个了子符串,数字或日期和时间值 4 ?数学函数:用于对作为函数参数提供的输入值执行操作,返冋一个数字值 5 ?元数据函数:返回有关数据库和对象和信息 6 ?字符串函数:对字符串输入值执行操作,并返回一个字中或数字值 7 ?系统函数:执行系统操作 8 ?系统统计函数:返回系统的统计信息 9 ?文本和图像函数:对于文本或图像输入值或列执行操作,返冋有关这些值的信息。 (二)、具体讲解: 1 ?系统函数 用于返回有关SQL Server系统,用户,数据库和数据库对彖的信息。系统函数可以让用户在得到信息后,使用条件语句,根据返回的信息进行不同的操作。与其它函数- 样,可以在select语句的select和where子句经及表达式中使用系统函数。 例:返回taihang数据库的yuan表中的第二列的名称。 use taihang select col_name ( object_id ( * yuan *),2) 注:col_name为系统函数,object_id :返回对彖的id。 2 ?日期和时间类型 日期和时间函数用于对日期和时间数据进行各种不同的处理和运算,并返回一个字符串,数字值或日期和时间值。 dateadd ( datepart , number ,date) dated iff ( datepart ,date1 ,date2) datename ( datepart ,date) datepart ( datepart ,date) day (date) getdate () month (date) year (date) 例1:从getdate函数返回的日期中提取月份数 select datepart ( month , getdate ()) as * month number * 注:datepart为系统函数 例2:从03/12/ 1998中返回月份、天数和年份数

第5章 使用VBA开发自定义函数

第5章 使用VBA开发自定义函数 在第1章中曾经提到过,可以在VBA中创建的两种过程——子过程和函数过程。在前面的例子中,我们创建和使用的都是子过程,它通常都可以完成某一种功能。而函数过程则是为了完成某种计算,并返回一个计算结果。在VBA中创建的函数过程不但可以在VB A中使用,而且还可以像其他 Excel内置工作表函数一样,在工作表的公式中使用。本章将重点介绍创建自定义函数并在工作表公式中使用的方法。 5.1了解函数过程中的参数 在Excel工作表公式中使用不同的函数时,通常都需要输入函数的参数,然后函数才能得出正确结果。当然,有极少一部分函数不需要参数,例如时间函数Now,在单元格中输入“=Now()”并按【Enter】键后,将得到当前的时间。 在VBA中编写自定义函数时,也要根据函数的功能为自定义函数设计不定数量的参数,以便在使用中用户可以给函数参数赋值而获得想要的结果。本节将介绍自定义函数参数的几种类型。 5.1.1不使用参数的函数 自定义函数可以不使用任何参数,这通常在需要通过自定义函数返回一个信息时使用。例如,下面的自定义函数返回当前工作簿的路径,它不需要使用任何参数:Function GetPath() GetPath = ActiveWorkbook.FullName End Function 当在单元格中输入“=GetPath()”并按【Enter】键后,将在单元格中显示当前工作簿的路径,如图5-1所示。当在单元格输入等号“=”后,可以通过Excel 2007的自动完成功能在列表中找到自定义函数。 图5-1 使用无参数函数返回工作簿路径

提示:与Excel内置的工作表函数一样,即使自定义函数不使用参数,但是在输入函数时也要包含一对圆括号。 5.1.2使用有—个参数的函数 有时可能需要通过给定一个数值来获得结果。例如,在使用Excel的工作表函数ABS 时,通过给定一个数字,返回它的绝对值。那么在自定义函数时,也可以为函数设置一个参数,在公式中使用自定义函数时,也要输入一个参数,才能得出正确结果。 例如,下面的自定义函数通过用户输入一个数字,来求得该数字的阶乘: Function CountF(Num) Dim i As Integer Dim Total As Long Total = 1 For i = 1 To Num Total = Total * i Next i CountF = Total End Function 在工作表中输入该函数时,要求输入一个参数,例如,输入“=CountF(5)”,按【Ente r】键后,将得到给定参数值的阶乘,如图5-2所示。 图5-2 使用一个参数的函数计算数字的阶乘 5.1.3使用多个参数的函数 如果需要参与计算的条件较多,一个参数不够用时,那么可以在自定义函数中设置多个参数。例如,可以创建一个自定义函数,根据给定的商品单价和销售数量,计算员工的销售提成金额。当销售额小于20000时,以销售额的6%作为提成金额;当销售额在20001到40000之间时,以销售额的8%作为提成金额;如果销售额大于40000,那么以销售额的10%作为提成金额。下面的自定义函数正是用来计算这种提成方法的: Function GetBonus(UPrice, Amount)

实验五 存储过程和触发器(计科)

实验五:触发器和存储过程 一、实验目的:理解触发器和存储过程的含义,掌握用SQL语句实现触发器和存储过程的编写,并初步掌握什么情况下使用事务。 二、预习要求:存储过程和触发器的相关概念,事务的相关概念,编写相应的SQL语句。 三、实验内容: 有一个小型的图书管理数据库,包含的表为: bookstore(bookid,bookname,bookauthor,purchasedate,state); --图书库存表 borrowcard(cardid,ownername);--借书证表 borrowlog(cardid,bookid,borrowdate,returndate);--借书记录表 写一个存储过程,实现借书操作,要求有事务处理。(1)读者借书,要先设置书籍不在库标志state(借出),然后增加借书记录,在同一事务中完成。(2)要求在事务执行过程中引入错误触发事件,以此体会事务的错误保护机制和事务编程的作用。(3)要求用触发器实现表的完整性控制。 四、完成情况(附上设计的SQL语句)。 ------触发器和存储过程 ------触发器和存储过程 CREATE DATABASE BOOK1 go use BOOK1 CREATE TABLE BOOKSTORE(Bookid nvarchar(10),Bookname nvarchar(10),Bookauthor nvarchar(10),purchasedate datetime,state Nvarchar(10),primary key(Bookid)) Create table Borrowcard(Cardid int,ownername nvarchar(10),primary key(Cardid)) Create table Borrowlog(Cardid int,Bookid nvarchar(10),borrowdate datetime,returndate datetime ,primary key(Cardid,Bookid))

实验11 存储过程和用户自定义函数_图

实验11 存储过程和用户自定义函数 实验目的 1.掌握通过企业管理器创建、修改、删除存储过程和用户自定义函数的方法 2.学会编写存储过程和用户自定义函数 3.掌握存储过程的执行方法 4.学会编写、调用三类用户自定义函数 实验准备 1.学习存储过程和用户自定义函数相关知识。 2.已掌握常程序控制流语句。 3.熟练使用T-SQL完成数据查询和程序设计。 4.还原studentdb数据库 实验内容和步骤 1.打开企业管理器,展开studentdb子目录,选中“存储过程”,单击鼠标右键,弹出 快捷菜单,选择【新建存储过程(S)…】,打开新建存储过程窗口,如图11- 1。 图11- 1 新建存储过程

2.新建并执行存储过程“字母打印”。 (1)在新建存储过程窗口输入以下代码。 CREATE PROCEDURE 字母打印AS 注解:该存储过程是将26个小写英文字母按a~z的顺序输出,其中ascii()函 数——返回字符对应ASCII码,char()函数——把ASCII码转换成对应字符。 (2)输入完成后,单击【检查语法】按钮,确认输入内容正确后,单击【确认】按 钮完成存储过程的创建。 (3)打开查询分析器,输入: exec 字母打印 (4)执行,查看运行结果。 3.修改存储过程“字母打印”并执行。 (1)在企业管理器存储过程列表窗格中,选中存储过程“字母打印”,弹出快捷菜 单,选择【属性(R)】,或直接双击该存储过程,打开属性窗口,如图11- 2。

图11- 2 存储过程“字母打印”属性窗口 (2)修改代码内容,将“print char(ascii('a')+@count)”改为“print char(ascii('A')+@count)”。 (3)单击【确认】按钮,完成存储过程的修改。 (4)重新在查询分析器执行该存储过程,查看运行结果。 4.新建并执行带输入参数的存储过程。 (1)在企业管理器中新建存储过程“成绩查询”,代码如下: (2)在查询分析器窗口中,选择studentdb数据库。要求:通过存储过程“成绩查 询”查看学号为“2007224117”的成绩。 ●方法一:输入exec 成绩查询‘2007224117’,并执行。 ●方法二:输入 执行,查看该同学的成绩。 注:以上是执行含输入参数存储过程的常用方法,参数可以直接通过值传递, 也可以通过变量传递。 5.练习:请新建存储过程“学生信息”,输入参数仍为学号,返回学号对应的“学生” 表信息,并通过该存储过程查看学号为“2007224117”的个人信息。 6.新建带返回参数的存储过程并执行。 (1)在企业管理器中新建存储过程“学生平均成绩”,代码如下:

用户自定义函数

用户自定义函数 函数是过程的另一种形式,又称为Function过程。它与过程不同的是,函数必须有返回值,向调用程序返回结果。 定义Function过程,语句格式如下: Function 函数名[(参数列表)][As 类型] …… Return value / 函数名=value End Function Function过程的调用比较简单,可以像使用https://www.360docs.net/doc/395292732.html,内部函数一样来调用Function过程,即将其名称和参数放在赋值语句的右边或表达式中。 例:定义并调用Function过程,求1~10的和 参数---形参和实参 在定义Sub和Function的过程中,“参数列表”中的参数称为“形式参数”,简称“形参”。形参用于接收数据,因此形参不能是常数。 在调用语句中使用的参数称为“实际参数”,简称“实参”。 实参可以是变量元素(已知变量、数组元素等)和非变量元素(常数、文本、枚举、表达式),在调用一个过程时,必须把实参传递给过程,完成实参和形参的结合。一般情况下实参按位置传给形参。

参数传递 在调用过程中,一般主过程与被调用过程之间有数据传递,即将主过程的实参传递给被调用过程中的形参,完成实参与形参的结合。 在参数传递过程中有两种方式,一种为值传递,使用ByVal关键字;另一种为按地址传递也称为引用,使用ByRef关键字。 在https://www.360docs.net/doc/395292732.html,中默认的参数传递机制是值传递。 按值传递 按值传递时,系统将实参复制给形参,然后实参与形参就断开了联系,形参只是接收到实参传递过来的值,实参和形参在各自独立的存储单元中,在调用过程中对形参的任何操作不会影响到实参,因此值传递可以保护实参中的数据不被过程所改变

fluent用户自定义函数

FLUENT UDF 教程 FLUENT UDF 教程 第一章. 介绍 本章简要地介绍了用户自定义函数(UDF)及其在Fluent中的用法。在1.1到1.6节中我们会介绍一下什么是UDF;如何使用UDF,以及为什么要使用UDF,在1.7中将一步步的演示一个UDF例子。 1.1 什么是UDF? 1.2 为什么要使用UDF? 1.3 UDF的局限 1.4 Fluent5到Fluent6 UDF的变化 1.5 UDF基础 1.6 解释和编译UDF的比较 1.7一个step-by-stepUDF例子 1.1什么是UDF? 用户自定义函数,或UDF,是用户自编的程序,它可以动态的连接到Fluent求解器上来提高求解器性能。用户自定义函数用C语言编写。使用DEFINE宏来定义。UDF中可使用标准C语言的库函数,也可使用Fluent Inc.提供的预定义宏,通过这些预定义宏,可以获得Fluent求解器得到的数据。 UDF使用时可以被当作解释函数或编译函数。解释函数在运行时读入并解释。而编译UDF 则在编译时被嵌入共享库中并与Fluent连接。解释UDF用起来简单,但是有源代码和速度方面的限制不足。编译UDF执行起来较快,也没有源代码限制,但设置和使用较为麻烦。 1.2为什么要使用UDF? 一般说来,任何一种软件都不可能满足每一个人的要求,FLUENT也一样,其标准界面及功能并不能满足每个用户的需要。UDF正是为解决这种问题而来,使用它我们可以编写FLUENT代码来满足不同用户的特殊需要。当然,FLUENT的UDF并不是什么问题都可以解决的,在下面的章节中我们就会具体介绍一下FLUENT UDF的具体功能。现在先简要介绍一下UDF的一些功能: λ定制边界条件,定义材料属性,定义表面和体积反应率,定义FLUENT输运方程中的源项,用户自定义标量输运方程(UDS)中的源项扩散率函数等等。 λ在每次迭代的基础上调节计算值 方案的初始化λ (需要时)UDF的异步执行λ 后处理功能的改善λ λ FLUENT模型的改进(例如离散项模型,多项混合物模型,离散发射辐射模型)由上可以看出FLUENT UDF并不涉及到各种算法的改善,这不能不说是一个遗憾。当然为了源代码的保密我们还是可以理解这样的做法的。其实,如果这些代码能够部分开放,哪怕就一点点,我想FLUENT会像LINUX一样发展更为迅速,使用更为广泛。遗憾的是,从目前来看,这只是一种幻想。什么时候中国人可以出自己的精品? 1.3 UDF的局限

存储过程和触发器实验报告

数据库技术与应用 实验报告七 班级:机械因材学号: 16 姓名:高永吉 一:实验名称:存储过程及触发器 二.实验目的: ⑴使用系统常用的存储过程; ⑵掌握存储过程的创建及应用 (3) 理解触发器的概念; (4) 掌握触发器的创建及应用。 三.实验内容、过程和结果: 存储过程 1创建一个存储过程.查看学号为1(根据实际情况取)的学生的信息.包括该学生的学号.班级编号.姓名。(提示:查询涉及到表Student)2执行1中创建的存储过程。 3使用输入参数创建题1中的存储过程。题1中所创建的存储过程只能学号为1的学生信息进行查看.要想对其他学生进行查看.需要进行参数传递。 4执行3中创建的存储过程.(1)按位置传递参数;(2)通过参数名传递参数; 5触发器 1)在课程表Course上创建一个触发器.该触发器被操作DELETE所触发.且要求触发触发器的DELETE语句在执行被取消。

2)在表Student中建立插入触发器, 插入一条记录时.若年龄>100或者年龄<=0,拒绝插入记录并显示:“年龄不符合规定.无法插入此记录!”; 3)创建一个触发器.如果在Student表中添加或更改数据.向客户端显示一条消息“你正在插入或修改学生表的数据”.要求触发触发器的DELETE、UPDATE语句被执行。 4 )为Course表创建一个名称为my_trig的触发器.当用户成功删除该表中的一条或多条记录时.触发器自动删除Student表中与之有关的记录。 5 )使用系统存储过程查看创建的触发器。 图一:创建一个存储过程.查看Tno为1(根据实际情况取)的教师的信息.包括该教师的姓名.sal

相关文档
最新文档