第10章 存储过程

第10章  存储过程
第10章  存储过程

第10章存储过程

存储过程是SQL语句和可选控制流语句的预编译集合,它以一个名称存储并作为一个单元处理。本章介绍存储过程的创建、执行、修改和删除等。

10.1 概述

存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其他强大的编程功能。存储过程可以使对数据库的管理,以及显示关于数据库及其用户信息的工作容易得多。

存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。

可以出于任何使用SQL语句的目的来使用存储过程,它具有以下优点:

可以在单个存储过程中执行一系列SQL语句。

可以从自己的存储过程内引用其他存储过程,这可以简化一

系列复杂语句。

存储过程在创建时即在服务器上进行编译,所以执行起来比

单个SQL语句快,且能减少网络通信的负担。

10.2创建存储过程

要使用存储过程,首先要创建一个存储过程。可以使用Transact-SQL 语言的CREATE PROCEDURE语句,也可以使用企业管理器或者存储过程创建向导来完成。

1.使用CREATE PROCEDURE语句创建存储过程

CREATE PROCEDURE语句的语法格式为:

CREATE PROC[EDURE ] procedure_name [; number]

[ {@parameter data_type}

[VARYING ][ = default][OUTPUT]

][,…n]

[WITH

{RECOMPILE | ENCRYPTION | RECOMPILE,ENCRYPTION}]

[FOR REPLICATION]

AS sql_statement […n ]

其中各参数含义如下:

procedure_name新存储过程的名称。

number 是可选的整数,用来对同名的过程分组,以便用一条

DROP PROCEDURE语句即可将同组的过程一起除去。例

如,名为orders的应用程序使用的过程可以命名为

orderproc;1、orderproc;2等。DROP PROCEDURE orderproc语

句将除去整个组。如果名称中包含定界标识符,则数字不应

包含在标识符中,只应在“procedure_name”前后使用适当的定

界符。

@parameter 过程中的参数。在CREATE PROCEDURE语句中

可以声明一个或多个参数。用户必须在执行过程时提供每个

所声明参数的值(除非定义了该参数的默认值)。存储过程最

多可以有2100个参数。

data_type 参数的数据类型。所有数据类型(包括text、ntext和

image)均可以用作存储过程的参数。不过,cursor数据类型只

能用于OUTPUT参数。如果指定的数据类型为cursor,也必须

同时指定VARYING和OUTPUT关键字。

VARYING 指定作为输出参数支持的结果集(由存储过程动态

构造,内容可以变化)。仅适用于游标参数。

default 参数的默认值。如果定义了默认值,不必指定该参数

的值即可执行过程。默认值必须是常量或NULL。

OUTPUT 表明参数是返回参数。该选项的值可以返回给

EXE[UTE]。使用OUTPUT参数可将信息返回给调用过程。

{RECOMPILE | ENCRYPTION | RECOMPILE,

ENCRYPTION} RECOMPILE表明SQL Server不会缓存该过

程的计划,该过程将在运行时重新编译。ENCRYPTION表示

SQL Server加密syscomments表中包含CREATE PROCEDURE

语句文本的条目。

FOR REPLICATION 指定不能在订阅服务器上执行为复制创

建的存储过程。

sql_statement 过程中要包含的任意数目和类型的Transact-

SQL语句。但有一些限制。

【例10.1】下面创建一个简单的存储过程stud_degree ,用于检索所有学生的成绩记录:

USE school

--判断stud_degree存储过程是否存在,若存在,则删除

IF EXISTS (SELECT name FROM sysobjects

WHERE name = 'stud_degree' AND type ='P')

DROP PROCEDURE stud_degree

GO

USE school

GO

--创建存储过程stud_degree

CREATE PROCEDURE stud_degree

AS

SELECT student.sno,student.sname,https://www.360docs.net/doc/3217076468.html,ame,score.degree

FROM student,course,score

WHERE student.sno=score.sno AND https://www.360docs.net/doc/3217076468.html,o=https://www.360docs.net/doc/3217076468.html,o

ORDER BY student.sno

GO

通过下述SQL语句执行该存储过程:

USE school

--判断stud_degree存储过程是否存在,若存在,则执行它

IF EXISTS (SELECT name FROM sysobjects

WHERE name = 'stud_degree' AND type ='P')

EXEC stud_degree /*执行存储过程stud_degree*/

GO

执行结果为:

sno sname cname degree

----- -------- ------------- --------------------

101 李军计算机导论 64

101 李军数字电路 85

103 陆君计算机导论 92

103 陆君操作系统 86

105 匡明计算机导论 88

105 匡明操作系统 75

107 王丽计算机导论 91

107 王丽数字电路 79

108 曾华计算机导论 78

108 曾华数字电路 81

109 王芳计算机导论 76

109 王芳操作系统 68

创建存储过程时应该注意下面几点:

存储过程的最大大小为128MB。

用户定义的存储过程只能在当前数据库中创建(临时过程除

外,临时过程总是在tempdb中创建)。

在单个批处理中,CREATE PROCEDURE语句不能与其他

Transact-SQL语句组合使用。

存储过程可以嵌套使用,在一个存储过程中可以调用其他的

存储过程。嵌套的最大深度不能超过32层。

存储过程如果创建了临时表,则该临时表只能用于该存储过

程,而且当存储过程执行完毕后,临时表自动被删除。

创建存储过程时,“sq_statement”不能包含下面的Transact-

SQL语句:SET SHOWPLAN_TEXT、SET

SHOWMAN_ALL、CREATE VIEW、CREATE DEFAULT、

CREATE RULE、CREATE PROCEDURE和CREATE

TRIGGER。

SQL Server允许创建的存储过程引用尚不存在的对象。在创建时,只进行语法检查。执行时,如果高速缓存中尚无有效的计划,则编译存储过程以生成执行计划。只有在编译过程中才解析存储过程中引用的所有对象。因此,如果语法正确的存储过程引用了不存在的对象,则仍可以成功创建;但在运行时将失败,因为所引用的对象不存在。

2.使用企业管理器创建存储过程

使用企业管理器创建存储过程的操作步骤如下:

(1) 打开企业管理器,展开服务器组,并展开相应的服务器。

(2) 打开“数据库”文件夹,并打开要创建存储过程的数据库。

(3) 选择“存储过程”选项,右击鼠标,执行“新建存储过程”命令,打开创建存储过程对话框,如图10.1所示。

图10.1创建存储过程

(4) 在“文本”列表框中显示了CREATE PROCEDURE语句的框架,可以修改要创建的存储过程的名称,然后加入存储过程所包含的SQL语

句。

(5) 单击“检查语法”按钮可以检查创建存储过程的SQL语句的语法是否正确。

(6) 如果要将其设置为下次创建存储过程的模板,可单击“另存为模板”按钮。

(7) 完成后,单击“确定”按钮即可创建一个存储过程。

3.使用向导创建

SQL Server 2000还提供了创建存储过程的向导.

【例10.2】 使用向导创建一个存储过程insert_table8_1,对应的操作步骤如下:

(1) 在企业管理器中,执行“工具”下拉菜单中的“向导”命令,打开“选择向导”对话框,如图10.2所示。

(2) 在“数据库”文件夹选择“创建存储过程”向导,单击“确定”按钮,出现创建存储过程向导欢迎对话框。

(3) 单击“下一步”按钮,出现选择数据库对话框,如图10.3所示。

(4) 选择数据库后,单击“下一步”按钮,出现选择存储过程对话框,如图10.4所示。

图10.2 “选择向导”对话框

图10.3选择数据库

图10.4 选择存储过程

在此对话框中,列出了所有表,以及可以对表进行的插入、删除和更新操作。可以通过选中每个表对应的复选框来确定要对表进行的操作。例如,选择table8表后面的“插入”栏中的复选框。

(5) 单击“下一步”按钮,出现完成创建存储过程对话框,如图10.5所示。若单击“完成”按钮,即可完成存储过程的创建。

(6) 单击“编辑”按钮,可编辑存储过程,如图10.6所示。

图10.5 完成创建存储过程

图10.6 编辑存储过程

(7) 单击“编辑SQL”按钮,即可打开“编辑存储过程SQL”对话框,其中的列表框显示了创建该存储过程的Transact-SQL语句,如图10.7所示。可以在已有的Transact-SQL语句的基础上进行编辑,可以单击“分析”按钮来执行语法检查。

(8) 单击“确定”按钮,返回到图10.5所示的对话框。

图10.7 “编辑存储过程SQL”对话框

10.3执行存储过程

执行存储过程使用EXECUTE语句,其完整语法格式如下:

[ [ EXEC[UTE] ]

[ @return_status = ]

{ procedure_name [ ;number ] | @procedure_name_var } [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] ]

[ ,…n ]

[ WITH RECOMPILE ]

各参数含义如下:

@return_status 是一个可选的整型变量,保存存储过程的返

回状态。这个变量在用于EXECUTE 语句前,必须在批处

理、存储过程或函数中声明过。

procedure_name 是调用的存储过程的名称。过程名称必须符

合标识符规则。无论服务器的代码页或排序方式如何,扩展

存储过程的名称总是区分大小写。

;number 是可选的整数,用于将相同名称的过程进行组合,

使得它们可以用一句 DROP PROCEDURE 语句除去。该参数

不能用于扩展存储过程。

@procedure_name_var 是局部定义变量名,代表存储过程名

称。

@parameter 是过程参数,在CREATE PROCEDURE 语句中

定义。参数名称前必须加上符号(@)。在以

@parameter_name =value 格式使用时,参数名称和常量不一

定按照CREATE PROCEDURE 语句中定义的顺序出现。但

是,如果有一个参数使用 @parameter_name = value 格式,则

其它所有参数都必须使用这种格式。默认情况下,参数可为

空。如果传递NULL 参数值,且该参数用于CREATE 或

ALTER TABLE 语句中不允许为 NULL 的列(例如,插入至不

允许为 NULL 的列),SQL Server 就会报错。为避免将 NULL

参数值传递给不允许为NULL 的列,可以在过程中添加程序

设计逻辑或采用默认值(使用 CREATE 或 ALTER TABLE 语

句中的 DEFAULT 关键字)。

value 是过程中参数的值。如果参数名称没有指定,参数值

必须以CREATE PROCEDURE 语句中定义的顺序给出。如

果参数值是一个对象名称、字符串或通过数据库名称或所有

者名称进行限制,则整个名称必须用单引号括起来。如果参

数值是一个关键字,则该关键字必须用双引号括起来。

@variable 是用来保存参数或者返回参数的变量。

OUTPUT 指定存储过程必须返回一个参数。该存储过程的匹

配参数也必须由关键字 OUTPUT 创建。使用游标变量作参数

时使用该关键字。

DEFAULT 根据过程的定义,提供参数的默认值。当过程需

要的参数值没有事先定义好的默认值,或缺少参数,或指定

了 DEFAULT 关键字,就会出错。

WITH RECOMPILE 强制编译新的计划。如果所提供的参数

为非典型参数或者数据有很大的改变,使用该选项。在以后

的程序执行中使用更改过的计划。该选项不能用于扩展存储

过程。建议尽量少使用该选项,因为它消耗较多系统资源。下面就是执行简单存储过程的例子:

EXEC stud_degree /*执行存储过程stud_degree*/

10.4 存储过程的参数

在创建和使用存储过程时,其参数是非常重要的。下面详细讨论存储过程的参数传递和返回。

1.使用参数

在调用存储过程时,有两种传递参数的方法。第一种是在传递参数时,使传递的参数和定义时的参数顺序一致,对于使用默认值的参数可以用DEFAULT代替。

例如,上面使用向导创建的insert_table8_1的存储过程如下:

CREATE PROCEDURE [insert_table8_1]

(@c1_1 [int], /*@c1_1和@c2_2是两个参数*/

@c2_2 [datetime])

AS INSERT INTO [test].[dbo].[table8]

( [c1],[c2])

VALUES ( @c1_1, @c2_2)

GO

则可以使用下面的SQL语句调用该存储过程:

USE test

GO

EXEC insert_table8_1 2,'2005-10-1'

GO

另外一种传递参数的方法是采用“参数=值”的形式,此时,各个参数的顺序可以任意排列。例如,上面的例子可以这样执行:EXEC insert_table8_1 @c1_1=3,@c2_2='2005-12-1'

2.使用默认参数

创建存储过程时,可以为参数提供一个默认值,默认值必须为常量或者NULL。

【例10.3】本例创建一个存储过程insert_table8_2,该存储过程中包含两个参数,其默认值分别为10和'2005-5-1':

USE test

GO

DELETE table8 /*删除表中全部记录*/

GO

CREATE PROCEDURE [insert_table8_2] /*创建存储过程insert_table8_2*/ (@c1_1 int =10, /*@c1_1和@c2_2是两个参数,分别设置了默认值*/

@c2_2 datetime = '2005-5-1')

AS INSERT INTO table8

( [c1],[c2]) VALUES ( @c1_1, @c2_2)

GO

EXEC insert_table8_2 /*执行存储过程insert_table8_2*/

EXEC insert_table8_2 20 /*执行存储过程insert_table8_2*/

EXEC insert_table8_2 30,'2004-12-20' /*执行存储过程

insert_table8_2*/

GO

SELECT * FROM table8

GO

执行结果如下:

c1 c2 --------- -----------------------------

10 2005-05-01 00:00:00.000

20 2005-05-01 00:00:00.000

30 2004-12-20 00:00:00.000

可以看到,当调用存储过程时没有指定参数值时就自动使用相应的

默认值。

3.使用返回参数

在创建存储过程时,可以定义返回参数。在执行存储过程时,可以

将结果返回给返回参数。返回参数应用OUTPUT进行说明。

【例10.4】本例创建一个存储过程average,它返回两个参数@st_name和@st_avg,分别代表了姓名和平均分:

USE school

GO

CREATE PROCEDURE average

(

@st_no int,

@st_name char(8) OUTPUT,

@st_avg float OUTPUT

)

AS

SELECT @st_name=student.sname,@st_avg=AVG(score.degree)

FROM student,score

WHERE student.sno=score.sno

GROUP BY student.sno,student.sname

HAVING student.sno=@st_no

执行该存储过程,来查询学号为“108”的学生姓名和平均分:

DECLARE @st_name char(8)

DECLARE @st_avg float

EXEC average 108,@st_name OUTPUT,@st_avg OUTPUT

SELECT '姓名'=@st_name,'平均分'=@st_avg

GO

执行结果为:

姓名平均分

-------- ---------------------------

曾华 79.5

4.存储过程的返回值

存储过程在执行后都会返回一个整型值。如果执行成功,则返回0;否则返回-1~-99之间的数值。也可以使用RETURN语句来指定一个返回值。

【例10.5】 本例创建的存储过程test_ret根据输入的参数来判断返回值:

USE test

GO

CREATE PROC test_ret

(

@input_int int = 0

)

AS

IF @input_int=0

RETURN 0 --如果输入的参数等于0,则返回0

IF @input_int>0

RETURN 1000 --如果输入的参数大于0,则返回1000

IF @input_int<0

RETURN -1000 --如果输入的参数等于0,则返回-1000

执行该存储过程:

DECLARE @ret_int int

EXEC @ret_int=test_ret 1

PRINT '返回值'

PRINT '-------'

PRINT @ret_int

EXEC @ret_int=test_ret 0

PRINT @ret_int

EXEC @ret_int=test_ret -1

PRINT @ret_int

执行结果为:

返回值

-------

1000

-1000

10.5存储过程的查看、修改和删除

可以使用sp_helptext存储过程来查看存储过程的定义信息。

【例10.6】 要查看前面的test_ret存储过程的定义信息,可以执行

下面的SQL语句:

USE test

GO

EXEC sp_helptext test_ret

GO

执行结果如下:

Text -----------------------------------------------------------------

CREATE PROC test_ret

(

@input_int int =0

)

AS

IF @input_int=0

RETURN 0 --如果输入的参数等于0,则返回0

IF @input_int>0

RETURN 1000 --如果输入的参数大于0,则返回1000

IF @input_int<0

RETURN -1000 --如果输入的参数等于0,则返回-1000

也可以使用企业管理器来查看存储过程的定义信息,操作步骤如

下:

(1) 打开企业管理器,展开服务器组,并展开相应的服务器。

(2) 打开“数据库”文件夹,然后选择存储过程所在的服务器。

(3) 打开“存储过程”文件夹,在右侧详细信息窗格中右击存储过程,

执行“属性”命令,打开“存储过程属性”对话框,如图10.8所示,是打开

前面创建的test_ret存储过程的结果。中间的“文本”编辑框中显示存储过

程的定义信息。

(4) 可以在此对话框中,直接修改存储过程的定义,也可以设置存储

过程的权限。完成后,单击“确定”按钮即可。

图10.8“存储过程属性”对话框

不再需要存储过程时可将其删除。这可以通过企业管理器来完成,在要删除的存储过程中右击鼠标,然后执行“删除”命令,在弹出的对话框中单击“全部除去”按钮即可。也可以通过DROP PROCEDURE语句来完成。

例如,要删除test_ret存储过程,可执行下面的SQL语句:

DROP PROCEDURE test_ret

如果另一个存储过程调用某个己删除的存储过程,则SQL Serve 2000会在执行该调用过程时显示一条错误信息。但如果定义了同名和参数相同的新存储过程来替换已删除存储过程,那么引用该过程的其他过程仍能顺利执行。

例如,如果存储过程procl引用存储过程proc2,而proc2被删除,但又创建了另一个名为proc2的存储过程,现在procl将引用这一新存储过程,procl也不必重新编译。

注意:存储过程分组后,将无法删除组内的单个存储过程。删

除一个存储过程会将同一组内的所有存储过程都删除。

练习题10

1.什么是存储过程?存储过程分为哪几类?使用存储过程有什么好处?

2.修改存储过程有哪几种方法?假设有一个存储过程需要修改但又不希望影响现有的权限,应使用哪个语句来进行修改?

上机实验题9

在前一个实验中建立的factory数据库上,完成如下各题:

(1) 创建一个为worker表添加职工记录的存储过程Addworker。

(2) 创建一个存储过程Delworker删除worker表中指定职工号的记录。

(3) 显示存储过程Delworker。

(4) 删除存储过程Addworker和Delworker。

存储过程的典型例子

可能有不少朋友使用SQL SERVER做开发也已经有段日子,但还没有或者很少在项目中使用存储过程,或许有些朋友认为根本没有必要使用存储过程等等。其实当你一个项目做完到了维护阶段时,就会发现存储过程给我们带来了好处了,修改方便,不能去改我们的应用程序,只需要改存储过程的内容,而且还可以使我们的程序速度得到提高。 QUOTE: SQL SERVER 联机丛书中的定义: 存储过程是保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合。 可以创建一个过程供永久使用,或在一个会话中临时使用(局部临时过程),或在所有会话中临时使用(全局临时过程)。 也可以创建在 Microsoft SQL Server 启动时自动运行的存储过程。 要使用存储过程,首先我们必需熟悉一些基本的T-SQL语句,因为存储过程是由于一组T-SQL语句构成的,并且,我们需要了解一些关于函数、过程的概念,因为我们需要在应用程序中调用存储过程,就像我们调用应用程序的函数一样,不过调用的方法有些不同。 下面我们来看一下存储过程的建立和使用方法。 一、创建存储过程 和数据表一样,在使用之前我们需要创建存储过程,它的简明语法是: QUOTE: CREATE PROC 存储过程名称 [参数列表(多个以“,”分隔)] AS SQL 语句 例: QUOTE: CREATE PROC upGetUserName @intUserId INT, @ostrUserName NVARCHAR(20) OUTPUT -- 要输出的参数 AS BEGIN -- 将uName的值赋给 @ostrUserName 变量,即要输出的参数 SELECT @ostrUserName=uName FROM uUser WHERE uId=@intUserId END 其中 CREATE PROC 语句(完整语句为CREATE PROCEDURE)的意思就是告诉SQL SERVER,

存储过程和触发器(数据库实验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/3217076468.html,o=https://www.360docs.net/doc/3217076468.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/3217076468.html,o=https://www.360docs.net/doc/3217076468.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

存储过程与触发器实验

第一章存储过程与触发器实验 实验目的 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

第9章 存储过程与存储函数

第9章存储过程与存储函数 一、选择题 1.MySQL中存储过程的建立以关键字()开始,后面仅跟存储过程的名称和参数。A.CREATE FUNCTION B.CREATE TRIGGER C.CREATE PROCEDURE D.CREATE VIEW 2.下列关于存储过程名描述错误的是()。 A.MySQL的存储过程名称不区分大小写。 B.MySQL的存储过程名称区分大小写。 C.存储过程名不能与MySQL数据库中的内置函数重名。 D.存储过程的参数名不要跟字段名一样。 3.下面声明变量正确的是()。 A.DECLARE x char(10) DEFAULT 'outer ' B.DECLARE x char DEFAULT 'outer ' C.DECLARE x char(10) DEFAULT outer D.DECLARE x DEFAULT 'outer ' 4.从tb_sutdent表中将名称为mrsoft的用户赋值给host,以下SQL语句正确的是()。A.SELECT host INTO name FROM tb_sutdent WHERE name ='mrsoft'; B.SELECT name INTO host FROM tb_sutdent WHERE name= 'LeonSK '; C.SELECT name INTO host FROM tb_sutdent WHERE name='mrsoft'; D.SELECT name INTO host FROM tb_sutdent WHERE name=‘mrsoft’; 5.光标的一般使用步骤,以下正确的是()。 A.声明光标使用光标打开光标关闭光标 B.打开光标声明光标使用光标关闭光标 C.声明光标打开光标选择光标关闭光标 D.声明光标打开光标使用光标关闭光标 6.下列控制流程语句中,MySQL存储过程不支持()。 A.WHILE B.FOR C.LOOP D.REPEAT 25

C#调用存储过程简单完整例子讲解

C#调用存储过程简单完整例子https://www.360docs.net/doc/3217076468.html,/itblog/article/details/752869 创建存储过程 Create Proc dbo.存储过程名 存储过程参数 AS 执行语句 RETURN 执行存储过程 GO DECLARE @iRet INT, @PKDisp VARCHAR(20) SET @iRet = '1' Select @iRet = CASE WHEN @PKDisp = '一' THEN 1 WHEN @PKDisp = '二' THEN 2 WHEN @PKDisp = '三' THEN 3 WHEN @PKDisp = '四' THEN 4 WHEN @PKDisp = '五' THEN 5 ELSE 100 END DECLARE @i INT SET @i = 1 WHILE @i<10 BEGIN set @i=@i+1 PRINT @i END DECLARE @d INT set @d = 1 IF @d = 1 BEGIN -- 打印 PRINT '正确' END ELSE BEGIN PRINT '错误' END

CREATE PROC P_TEST @Name VARCHAR(20), @Rowcount INT OUTPUT AS BEGIN SELECT * FROM T_Customer WHERE NAME=@Name SET @Rowcount=@@ROWCOUNT END GO ---------------------------------------------------------------------------------------- --存储过程调用如下: ---------------------------------------------------------------------------------------- DECLARE @i INT EXEC P_TEST 'A',@i OUTPUT SELECT @i --结果 /* Name Address Tel ---------- ---------- -------------------- A Address Telphone (所影响的行数为 1 行) ----------- 1 (所影响的行数为 1 行) */ ---------------------------------------------------------------------------------------- --DotNet 部分(C#) --WebConfig 文件: ---------------------------------------------------------------------------------------- ......

实验六 存储过程和触发器

实验六存储过程与触发器 一、目的与要求 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

数据库第8-11章习题

第8章数据库编程 一、选择题 1、修改存储过程使用的语句是()。 A. ALTER PROCEDURE B. DROP PROCEDURE C. INSERT PROCEDUE D. DELETE PROCEDUE 2、创建存储过程的语句是()。 A. ALTER PROCEDURE B. DROP PROCEDURE C. CREATE PROCEDUE D. INSERT PROCEDUE 3、下面()组命令,将变量count值赋值为1。 A.DECLARE @count SELECT @count=1 B.DIM count=1 C.DECLARE count SELECT count=1 D.DIM @count SELECT @count=1 4、在SQL Server 中删除存储过程用()。 A.ROLLBACK B. DROP PROC C.DELALLOCATE D. DELETE PROC 10.在SQL Server 编程中,可使用()将多个语句捆绑。 A.{} B. BEGIN-END C.( ) D. [ ] 二、填空题 1、在T-SQL编程语句中,WHILE结构可以根据条件多次重复执行一条语句或一个语句块,还可以使用()和CONTINUE 关键字在循环内部控制 WHILE 循环中语句的执行。 2、存储过程是存放在()上的预先定义并编译好的T-SQL语句。 3、游标是系统为用户开设的一个(),存放SQL语句的执行结果 第9章关系查询处理和查询优化 课后作业:P275,2题答案:

1 2、事务的原子性是指。 A.事务中包括的所有操作要么都做,要么都不做 B.事务一旦提交,对数据库的改变是永久的 C.一个事务内部的操作及使用的数据对并发的其他事务是隔离的 D.事务必须是使数据库从一个一致性状态变到另一个一致性状态 3、事务的一致性是指。 A.事务中包括的所有操作要么都做,要么都不做 B.事务一旦提交,对数据为的改变是永久的 C.一个事务内部的操作及使用的数据对并发的其他事务是隔离的 D.事务必须是使数据库从一个一致性状态变到另一个一致性状态 4、事务的隔离性是指。 A.事务中包括的所有操作要么都做,要么都不做 B.事务一旦提交,对数据库的改变是永久的 C.一个事务内部的操作及使用的数据对并发的其他事务是隔离的 D.事务必须是使数据库从一个一致性状态变到另一个一致性状态 5、事务的持续性是指。 A.事务中包括的所有操作要么都做,要么都不做

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

信息工程学院实验报告 课程名称:《数据库原理》 实验项目名称:存储过程与触发器 一、实验目的: (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/3217076468.html,ame as课程名称, study.grade as考试分数 from student,course,study where student.sno=study.sno and https://www.360docs.net/doc/3217076468.html,o=https://www.360docs.net/doc/3217076468.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年级

第10章 存储过程、函数和包

第10章存储过程、函数和包 存储过程(PROCEDURE)、函数(FUNCTION)和包(PAKAGE)是以编译的形式存储在数据库中的数据库的对象,并成为数据库的一部分,可作为数据库的对象通过名字被调用和访问。 存储过程通常是实现一定功能的模块;函数通常用于计算,并返回计算结果;包分为包头和包体;用于捆绑存放相关的存储过程和函数,起到对模块归类打包的作用。 存储过程、函数和包是数据库应用程序开发的重要方法,三者既有区别,也有联系。 ?存储过程和存储函数。 ?过程的参数和调用。 ?包和包的应用。 10.1 存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块。但存储过程和函数不同于已经介绍过的PL/SQL程序,我们通常把PL/SQL程序称为无名块,而存储过程和函数是以命名的方式存储于数据库中的。 10.1.1 认识存储过程和函数 和PL/SQL程序相比,存储过程有很多优点,具体归纳如下: ·存储过程和函数以命名的数据库对象形式存储于数据库当中。存储在数据库中的优点是很明显的,因为代码不保存在本地,用户可以在任何客户机上登录到数据库,并调用或修改代码。 ·存储过程和函数可由数据库提供安全保证,要想使用存储过程和函数,需要有存储过程和函数的所有者的授权,只有被授权的用户或创建者本身才能执行存储过程或调用函数。 ·存储过程和函数的信息是写入数据字典的,所以存储过程可以看作是一个公用模块,用户编写的PL/SQL程序或其他存储过程都可以调用它(但存储过程和函数不能调用PL/SQL 程序)。一个重复使用的功能,可以设计成为存储过程,比如:显示一张工资统计表,可以设计成为存储过程;一个经常调用的计算,可以设计成为存储函数;根据雇员编号返回雇员的姓名,可以设计成存储函数。 ·像其他高级语言的过程和函数一样,可以传递参数给存储过程或函数,参数的传递也有多种方式。存储过程可以有返回值,也可以没有返回值,存储过程的返回值必须通过参数带回;函数有一定的数据类型,像其他的标准函数一样,我们可以通过对函数名的调用返回函数值。 存储过程和函数需要进行编译,以排除语法错误,只有编译通过才能调用。

第11章 数据库备份

第十一章数据库的备份 11.1 概述 数据库的备份和恢复是数据库管理员的重要职责之一。 不管数据库系统如何精心设计、配置和优化,它们都难免出现系统或硬件故障,从而引起数据库中的数据遭到破坏,当数据库中的数据遭到破坏时,数据库管理员必须尽快从数据备份中恢复数据,从而将损失减少到最小,保证用户的正常使用。数据库的备份对成功恢复数据是非常关键的,数据库管理员必须根据企业的需要,制定出良好的备份和恢复策略,并认真实施它。 11.1.1 Oracle备份的概念 数据库的备份是数据库的拷贝。当原来的数据丢失时,可以使用备份重建丢失的信息(组成Oracle数据库的物理文件)。该拷贝包括数据库的重要部分,如控制文件、存档日志和数据文件等。 备份包括物理备份和逻辑备份,物理备份是所采用的最主要的备份方式,是物理数据库文件的拷贝。如果发生物理数据库丢失或崩溃,物理备份用于保证数据库在最小的数据丢失或没有数据丢失的情况下得到恢复。它实际上进行上的是物理文件的拷贝,包含拷贝构成数据库的文件而不管其逻辑内容,进行物理备份可以采用两种方法: ?使用恢复管理器(Recovery Manager,简称RMAN)程序; ?操作系统文件备份命令,也叫做文件系统备份。Oracle 支持两种不同类型的物理文件备份:脱机备份(offline backup)和联机备份(online backup)。 相应的逻辑备份用于实现数据库对象(比如数据库表或存储过程)的恢复并且它是一个全面备份策略的必要的组成部分,它通常采用Oracle的Export程序将逻辑数据导出并以二进制的方式存储。一般来说我们使用逻辑备份作为物理备份的必要补充。 11.1.2 Oracle数据库系统故障类型 不管数据库系统如何精心设计、配置和优化,它们都难免出现系统或硬件故障,语句和进程故障。这些故障大致可以分为以下几大类: 1. 介质故障 在读或写要求操作数据库的文件时可能会出现错误,这种故障就叫做介质故障,因为在读或写存储介质上的文件时会出现物理问题。一个常见的介质故障的例子是磁头的碰撞会引起磁盘驱动器上所有文件的丢失。介质故障是数据库数据的最大威胁。介质问题主要有:?磁盘磁头故障使磁盘驱动器上所有文件丢失。 ?数据文件、控制文件、联机或归档重做日志文件被意外删除、覆盖或损坏。 从介质故障中恢复的合适策略取决于受到影响的文件。介质故障是备份与恢复策略所需

oracle存储过程讲解及实例

存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它; 行2: IS关键词表明后面将跟随一个PL/SQL体。 行3: BEGIN关键词表明PL/SQL体的开始。 行4: NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句; 行5: END关键词表明PL/SQL体的结束

存储过程创建语法: create or replace procedure 存储过程名(param1 in type,param2 out type) as 变量1 类型(值范围); --vs_msg VARCHAR2(4000); 变量2 类型(值范围); Begin Select count(*) into 变量1 from 表A where列名 =param1; If (判断条件) then Select 列名into 变量2 from 表A where列名 =param1; Dbms_output。Put_line(‘打印信息’); Elsif (判断条件) then Dbms_output。Put_line(‘打印信息’); Else Raise 异常名(NO_DATA_FOUND); End if; Exception When others then Rollback;

End; 注意事项: 1,存储过程参数不带取值范围,in表示传入,out表示输出 类型可以使用任意Oracle中的合法类型。 2,变量带取值范围,后面接分号 3,在判断语句前最好先用count(*)函数判断是否存在该条操作记录 4,用select 。。。into。。。给变量赋值 5,在代码中抛异常用 raise+异常名 CREATE OR REPLACE PROCEDURE存储过程名 ( --定义参数 is_ym IN CHAR(6) ,

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

实验五:触发器和存储过程 一.实验目的:理解触发器和存储过程的含义,掌握用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

第十一章 活动目录的维护

第十一章活动目录的维护 内容摘要 本章重点介绍Windows2000活动目录数据的存储过程和维护方法。重点包括: ? 活动目录数据的备份和恢复 ? 活动目录数据的优化 ? 活动目录的维护程序 考点提示 ? 活动目录的授权恢复和非授权恢复 ? 管理活动目录对象移动的程序:Movetree ? Ntdsutil.exe的应用 11.1 活动目录维护简介 造成Windows2000活动目录故障的原因很多,后果也不完全相同,如系统不能启动,不能登录,网络访问和网络验证出现故障等。当活动目录出现故障时,首先应查找可能引起故障的原因,然后根据掌握的资源情况,制定修复策略,对活动目录进行修复。 11.2 活动目录数据的维护 Windows2000活动目录将数据存储在一个事物数据库和日志文件中,对活动目录数据进行维护可以在系统出现故障时,如硬盘损坏或者软件系统崩溃而导致数据丢失时,对数据进行有效的恢复。活动目录数据维护的关键在于对活动目录数据库和日志文件进行有效的维护。 Windows2000服务器对活动目录数据提供如下的维护方法: ? 备份和恢复。使用Windows2000自带的备份工具可以对活动目录数据库进行备份和恢复。活动目录数据库在Windows2000中是整个系统数据的一部分。 ? 移动。Windows2000服务器支持将活动目录数据库从一个地方移动到另一个地方,注意移动一个活动目录数据库文件后,原文件并不会自动删除,而是继续存在,这儿的移动和复制有一些相似。 ? 碎片整理。频繁的数据库访问会造成磁盘空间利用率下降。碎片整理可以重新排列数据库中的数据,回收可以利用的磁盘空间。 11.2.1 活动目录数据的存储过程 Windows2000活动目录使用可扩展的存储引擎(ESE)对数据进行存储。ESE应用事务和日志的概念将数据存储在数据库和事务日志文件中。所谓事务(Transaction),是指系统作为一个不可分割的整体进行处理的更改、添加、删除等操作的集合。 活动目录数据存储的基本过程如下: 1、为数据库更改创建一个事务 2、向日志文件中写入事务 3、将事务写入内存缓冲区 4、将更改在系统空闲的时候写入数据库 5、更改指向日志中未写入数据库的数据项的指针。

SQL存储过程实例

题目1 1、学校图书馆借书信息管理系统建立三个表: 学生信息表:student 图书表:book 借书信息表:borrow 请编写SQL语句完成以下的功能: 1)查询“计算机”专业学生在“2007-12-15”至“2008-1-8”时间段内借书的学生编号、 学生名称、图书编号、图书名称、借出日期;参考查询结果如下图所示: 2)查询所有借过图书的学生编号、学生名称、专业;参考查询结果如下图所示:

3)查询借过作者为“安意如”的图书的学生姓名、图书名称、借出日期、归还日期; 参考查询结果如下图所示: 4)查询目前借书但未归还图书的学生名称及未还图书数量;参考查询结果如下图所 示: 附加:建表语句:

标准答案:

题目2 程序员工资表:ProWage 创建一个存储过程,对程序员的工资进行分析,月薪1500到10000不等,如果有百分之五十的人薪水不到2000元,给所有人加薪,每次加100,再进行分析,直到有一半以上的人大于2000元为止,存储过程执行完后,最终加了多少钱? 例如:如果有百分之五十的人薪水不到2000,给所有人加薪,每次加100元,直到有一半以上的人工资大于2000元,调用存储过程后的结果如图:

请编写T-SQL来实现如下功能: 1)创建存储过程,查询是否有一半程序员的工资在2200、3000、3500、4000、5000或6000 元之上,如果不到分别每次给每个程序员加薪100元,至之一半程序员的工资达到2200,3000,3500,4000,5000或6000元。 2)创建存储过程,查询程序员平均工资在4500元,如果不到则每个程序员每次加200元, 至到所有程序员平均工资达到4500元。 建表语句

第12章 存储过程

第12章存储过程 12.1 存储过程概述 存储过程是一种命名PL/SQL程序块,它将一些相关的SQL语句,流程控制语句组合在一起,用于执行某些特定的操作或者任务。将经常需要执行的特定的操作写成过程,通过过程名,就可以多次调用过程,从而实现程序的模块化设计,这种方式提高了程序的效率,节省了用户的时间。 存储过程具有以下特点: ●存储过程在服务器端运行,执行速度快。 ●存储过程增强了数据库的安全性。 ●存储过程允许模块化程序设计。 ●存储过程可以提高系统性能。 12.2 存储过程的创建和调用 12.2.1 创建存储过程 1. 通过PL/SQL 语句创建存储过程 PL/SQL创建存储过程使用的语句是CREATE PROCEDURE。 语法格式: CREATE [OR REPLACE] PROCEDURE <过程名> /*定义过程名*/ [ (<参数名> <参数类型> <数据类型> [ DEFAULT <默认值>] [, …n])] /*定义参数类型及属性*/ { IS | AS } [<变量声明>] /*变量声明部分*/ BEGIN <过程体> /*PL/SQL过程体*/ END [<过程名>][;] 说明: (1)OR REPLACE:如果指定的过程已存在,则覆盖同名的存储过程。 (2)过程名:定义的存储过程的名称。 (3)参数名:存储过程的参数名必须符合有关标识符的规则,存储过程中的参数称为形式参数(简称形参),可以声明一个或多个形参,调用带参数的存储过程则应提供相应的实际参数(简称实参)。 (4)参数类型:存储过程的参数类型有IN、OUT和IN OUT 三种模式,默认的模式是IN模式。 ●IN:向存储过程传递参数,只能将实参的值传递给形参,在存储过程内部只能读不能写,对应IN模式的实参可以是常量或变量。 ●OUT:从存储过程输出参数,存储过程结束时形参的值会赋给实参,在存储过程内部可以读或写,对应OUT模式的实参必须是变量。 ●IN OUT:具有前面两种模式的特性,调用时,实参的值传递给形参,结束时,形参的值传递给实参,对应IN OUT模式的实参必须是变量。 (5)DEFAULT:指定IN参数的默认值,默认值必须是常量。 (6)过程体:包含在过程中的PL/SQL 语句。 存储过程可以带参数,也可以不带参数。 【例12.1】创建一个不带参数的存储过程spTest,输出Hello Oracle。 CREATE OR REPLACE PROCEDURE spTest /*创建不带参数的存储过程*/

第11章 项目采购管理

第十一章项目采购管理 1.下列哪项是用于征求潜在卖方的建议书? A.采购文件 B.卖方建议书 C.需求文件 D.合作协议 2.合同比其他项目文件需要经过更多审批的原因在于: A.合同更重要 B.合同涉及双方的利益 C.合同更复杂 D.合同具有法律约束力 3.审批过程的主要目标是_____。 A.降低风险 B.将风险转移给其他人 C.确保以清晰的合同语言来描述产品、服务或成果,以便满足既定的项目需要 D.确保项目成员都能了解合同 4.在合同收尾前,经双方共同协商,我们可以根据下列哪项对合同进行修改? A.合同的变更控制条款 B.合同终止条款 C.替代争议解决 D.采购管理计划 5.作为制定进度计划的输出,项目进度计划也是下述哪项的输入? A.规划采购 B.实施采购 C.管理采购 D.结束采购 6.采购审计发生在下列哪个过程中? A.规划采购 B.实施采购 C.管理采购 D.结束采购 7.一个项目经理第一次编制采购文件,他向你请教有关采购文件的相关知识。你可以提供给他下列建议, 除了____。 A.买方拟订的采购文件应便于潜在卖方做出准确、完整的应答 B.采购文件的复杂和详细程度应与采购的价值和风险水平相适应 C.采购文件必须严格,不允许卖方提建议 D.买方拟订的采购文件要便于对卖方应答进行评价 8.供方选择标准在下列哪个过程中产生? A.规划采购 B.实施采购 C.管理采购 D.结束采购 9.有争议的变更也可被称为下列各项,除了___。 A.索赔 B.争议 C.诉求 D.问题 10.下列哪项内容描述了如何管理从制定采购文件直到合同收尾的各个采购过程? A.成本绩效基准 B.采购管理计划 C.自制或外购决策 D.采购文件

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

南昌航空大学实验报告 二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/3217076468.html,o,cna,pna,num from paper,customer,cp where https://www.360docs.net/doc/3217076468.html,o=https://www.360docs.net/doc/3217076468.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' 五、实验结果

DB2存储过程简单例子

DB2存储过程简单例子 客户在进行短信服务这个业务申请时,需要填写一些基本信息,然后根据这些信息判断这个用户是否已经存在于业务系统中。因为网上服务和业务系统两个项目物理隔离,而且网上数据库保存的客户信息不全,所以判断需要把数据交换到业务系统,在业务系统中判断。 解决方式是通过存储过程,以前也了解过存储过程,但没使用到项目中。不过经过一番努力最后还是完成了,期间遇到了一些困难,特写此文让对DB2存储过程还不熟悉的童鞋避免一些无谓的错误。 DROP PROCEDURE "PLName" @ CREATE PROCEDURE "PLName"(--存储过程名字 IN IN_ID BIGINT , --以下全是输入参数 IN IN_ENTNAME VARCHAR(200) , IN IN_REGNO VARCHAR(50), IN IN_PASSWORD VARCHAR(20), IN IN_LEREP VARCHAR(300), IN IN_CERTYPE CHARACTER(1), IN IN_CERNO VARCHAR(50), IN IN_LINKMAN VARCHAR(50), IN IN_SEX CHARACTER(1), IN IN_MOBTEL VARCHAR(30), IN IN_REQDATE TIMESTAMP, IN IN_REMITEM VARCHAR(300), IN IN_STATE CHARACTER(1), IN IN_TIMESTAMP TIMESTAMP ) BEGIN declare V_RESULT BIGINT; --声明变量 DELETE FROM TableNameA WHERE ID = IN_ID;

第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

相关文档
最新文档