触发器与存储过程

合集下载

MySQL中的触发器和存储过程的区别与用途

MySQL中的触发器和存储过程的区别与用途

MySQL中的触发器和存储过程的区别与用途MySQL是一种常用的关系型数据库管理系统,广泛应用于各种互联网应用中。

在MySQL中,触发器(Trigger)和存储过程(Stored Procedure)是两种常见的编程方式,用于实现数据库操作的自动化和业务逻辑的封装。

本文将探讨MySQL中的触发器和存储过程的区别和用途。

一、触发器触发器是MySQL中一种特殊的数据库对象,它和数据库表关联,并在表中的指定事件发生时自动执行特定的操作。

触发器是基于事件驱动的,它可以在数据插入、更新或删除时触发执行相应的操作。

1. 触发器的创建在MySQL中,创建触发器需要使用CREATE TRIGGER语句,并指定触发时机、触发事件、触发操作和触发操作所执行的SQL语句。

例如,我们可以创建一个在数据插入前触发的触发器如下所示:```CREATE TRIGGER before_insert_triggerBEFORE INSERT ON table_nameFOR EACH ROWBEGIN-- 触发操作所执行的SQL语句...END;```2. 触发器的用途触发器可以用于各种场景,例如数据自动更新、数据约束、数据一致性等。

下面以一个实例来说明触发器的用途。

假设我们有一个订单表和一个库存表,每当有订单数据插入时,我们希望自动更新库存表中对应商品的库存数量。

这时,就可以使用触发器实现该功能。

```CREATE TRIGGER update_inventoryAFTER INSERT ON ordersFOR EACH ROWBEGINUPDATE inventorySET quantity = quantity - NEW.amountWHERE product_id = NEW.product_id;END;```在上述示例中,我们创建了一个名为update_inventory的触发器,它在订单表插入数据后触发,然后执行更新库存表的操作。

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

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

存储过程及触发器实验报告实验目的:1、了解存储过程及其应用;2、了解触发器及其应用;3、掌握使用存储过程及触发器完成数据操作的方法。

实验过程:1、存储过程存储过程是指一组为了完成特定功能的SQL语句集合。

存储过程可以接收传入参数并返回处理结果。

存储过程的好处是可以减少网络流量,提高性能,增加安全性。

在本次实验中,我们将学习如何创建存储过程。

首先,在MySQL中打开MySQL Workbench,进入我们的实验数据库。

然后我们就可以创建一个存储过程了。

创建存储过程的语法如下:CREATE PROCEDURE procedure_name ()BEGIN-- SQL statementsEND;在这个语法中,procedure_name是我们想要创建的存储过程的名称。

在BEGIN和END 之间,我们可以输入一组SQL语句,这些语句将组成存储过程的主体内容。

我们可以以一个创建一个简单的存储过程作为例子,这个存储过程的作用是输出一条信息。

我们将这个存储过程命名为print_message。

在上面的语句中,我们定义了一个存储过程,它被命名为print_message。

它只包含一条SELECT语句,这条语句将输出Hello, World!这个字符串。

创建完存储过程之后,我们可以通过CALL语句来调用它:CALL print_message();执行这个语句后,我们将会看到Hello, World!这个字符串输出到屏幕上。

2、触发器触发器是一种被动的对象,它是由数据库管理系统在数据表上自动执行的一些操作。

当数据表中发生某些指定的操作时,触发器就会被调用执行。

触发器通常用于数据表中的数据变更操作,比如插入、更新和删除。

在本次实验中,我们将学习如何创建和使用触发器。

在MySQL中创建触发器的语法如下:CREATE TRIGGER trigger_name{BEFORE | AFTER} trigger_event ON table_nameFOR EACH ROW trigger_body;在这个语法中,trigger_name是我们想要创建的触发器的名称。

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

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

数据库基础与实践实验报告实验五存储过程和触发器班级:惠普测试142学号:**********姓名:***日期:2016-11-141 实验目的:1)掌握SQL进行存储过程创建和调用的方法;2)掌握SQL进行触发器定义的方法,理解触发器的工作原理;3)掌握触发器禁用和重新启用的方法。

2 实验平台:操作系统:Windows xp。

实验环境:SQL Server 2000以上版本。

3 实验内容与步骤利用实验一创建的sch_id数据库完成下列实验内容。

1.创建存储过程JSXX_PROC,调用该存储过程时可显示各任课教师姓名及其所教课程名称。

存储过程定义代码:CREATE PROCEDURE JSXX_PROCASSELECT tn 教师姓名,cn 所教课程FROM T,TC,C WHERE T.tno=TC.tno AND o=o存储过程执行语句与执行结果截图:EXECUTE JSXX_PROC2.创建存储过程XM_PROC,该存储过程可根据输入参数(学生姓名)查询并显示该学生的学号、所学课程名称和成绩;如果没有该姓名学生,则提示“无该姓名的同学”。

存储过程定义代码:CREATE PROCEDURE XM_PROC @sname VARCHAR(100)ASBEGINIF EXISTS(SELECT NULL FROM S WHERE sn=@sname)SELECT S.sno 学号,cn 课程,score 成绩FROM S,SC,C WHERE o=o AND SC.sno=S.sno ANDS.sn=@snameELSEPRINT'无该姓名的同学。

'END运行截图:3.创建存储过程XBNL_PROC,该存储过程可根据输入参数(专业名词,默认值为计算机专业),统计并显示该专业各年龄段男、女生人数。

如果没有该专业,则显示“无此专业”。

存储过程定义代码:CREATE PROCEDURE XBNL_PROC@departName VARCHAR(30)='计算机',@begin INT,@end INTASDECLARE @numOfBoys INTDECLARE @numOfGirls INTDECLARE @d# VARCHAR(3)DECLARE @result VARCHAR(50)BEGINSELECT @d# = dno FROM D WHERE dn=@departNameIF @d# IS NOT NULLBEGINSELECT @numOfBoys =COUNT(sno)FROM S WHERE age BETWEEN @begin AND @end AND dno=@d# AND sex='男'SELECT@numOfGirls =COUNT(sno)FROM S WHERE age BETWEEN@begin AND@end AND dno=@d# AND sex='女'SET @result = @departName+'专业年龄在'+CAST(@begin AS VARCHAR(3))+'-'+CAST(@end AS VARCHAR(3))+'之间的男生有'+CAST(@numOfBoys AS VARCHAR(3))+'人,'+'女生有'+CAST(@numOfGirls AS VARCHAR(3))+'人'ENDELSESET @result='无此专业。

SQL存储过程和触发器

SQL存储过程和触发器
返回 上页
10.5.3 某些设计规则
在设计触发器时,顾客能够参照下列旳设计规则: DML触发器旳实现者是表旳默认拥有者,权限不能转移给别旳
顾客。 DML触发器必须是在目前数据库上创建,尽管它能够引用别旳
数据库。 不能对系统表和临时表创建触发器。 每个表能够有多种不同名称旳AFTER触发器,但每种触发事件
返回 上页
10.4.1 触发器旳特点
触发器是一种特殊旳存储过程,除了存储过程旳特点 外,它还另外有下列特点:
触发器是自动执行旳,能够在一定条件下触发。 触发器能够同步数据库旳有关表,进行级联更改。 触发器能够实现更复杂旳安全检验。它能够实现比CHECK
更复杂旳业务规则,还能够引用其他表中旳列。 触发器能够实现数据库旳管理任务。如DDL触发器,在
返回 上页
10.1.2 存储过程旳分类
1. 顾客存储过程 2. 系统存储过程 3. 扩展存储过程
返回 上页
10.2 设计存储过程
10.2.1 某些设计规则
顾客在设计数据库(旳存储过程)时,应遵守下列规则: 在SQL Server 2023中,存储过程能够使用Transact-SQL 中旳任何语句,但是表10.1中旳语句除外。
第10章 存储过程和触发器
教学提醒:开发中编写旳某些SQL语句会占用程序旳很大 篇幅,而且不便于在其他地方重用,且因为这些SQL语句 一般还要跨越传播途径从外部不但会造成程序旳运营效率 低,还会产生安全隐患,而存储过程则能克服以上旳缺陷。 触发器能够大大增强应用程序旳强健性、数据库可恢复性 和数据库旳可管理性。 存储过程和触发器都是SQL Server旳数据库对象。存储过 程旳存在独立于表,它存储在服务器上,供客户端调用。
只能有一种INSTEAD OF类型触发器。 触发器只能创建在表或者视图旳模式中。

数据库中触发器与存储过程的性能对比研究与最佳实践

数据库中触发器与存储过程的性能对比研究与最佳实践

数据库中触发器与存储过程的性能对比研究与最佳实践触发器(Trigger)和存储过程(Stored Procedure)是数据库中常用的两种编程对象,它们在处理数据库操作和逻辑时扮演着重要的角色。

然而,对于开发人员来说,在选择和使用触发器和存储过程时需要考虑性能方面的因素。

本文将对数据库中触发器和存储过程的性能进行详细的对比研究,并提供最佳实践建议。

首先,我们来了解触发器和存储过程的基本概念和作用。

触发器是一种被动的数据库对象,它在特定的操作(如插入、更新或删除)发生时自动执行特定的SQL语句。

触发器常用于实现数据一致性和完整性约束、日志记录等功能。

而存储过程则是一组预定义的SQL语句集合,它可以被重复调用以完成特定的任务。

存储过程通常用于集中管理和处理复杂的业务逻辑和数据操作。

性能方面,触发器和存储过程在执行速度和资源使用方面有所差异。

触发器在数据操作时会自动触发执行,因此会增加数据库操作的时间开销。

而存储过程则需要显式地调用才能执行,因此可以更加灵活地控制和优化执行顺序和方式。

另外,触发器的执行是针对每一条数据操作的,而存储过程的执行是针对整个过程的。

这就意味着当需要处理大量数据时,触发器的性能可能会受到限制。

在设计和使用触发器时,以下几点是可以优化性能的最佳实践。

首先,尽量避免在触发器中执行复杂的查询操作,因为触发器的执行会在数据操作的上下文中执行,且触发器是同步执行的。

如果在触发器中执行复杂查询,会增加数据操作的执行时间。

其次,如果触发器的逻辑可以通过其他方式实现,如应用程序代码或存储过程,就尽量避免使用触发器。

这是因为触发器会增加数据库系统的负担和开销,尤其当同时存在多个触发器时。

在设计和使用存储过程时,以下几点是可以优化性能的最佳实践。

首先,减少存储过程的执行时间。

可以通过优化SQL语句、使用适当的索引、避免使用循环等方式来减少存储过程的执行时间。

其次,合理使用参数和返回值。

通过使用参数和返回值规范输入输出,可以提高存储过程的执行效率和可维护性。

存储过程与触发器

存储过程与触发器

9.1.3
创建、执行、修改、删除简单存储过程
简单存储过程即不带参数的存储过程,下面介绍简单存储过程 的创建及使用。
1. 创建简单存储过程
在SQL Server中通常可以使用两种方法创建存储过程:一 种是使用企业管理器创建存储过程。另一种是使用查询分 析器执行SQL语句创建存储过程。创建存储过程时,需要注 意下列事项:
图9-1 创建存储过程的界面
(2)使用SQL语句创建存储过程。在查询分析器中,用SQL语 句创建存储过程的语法格式如下: CREATE PROC [EDURE] procedure_name [;number] [{@parameter data_type} [VARYING] [=default] [OUTPUT] ][,…n] [WITH {RECOMPLE|ENCRYPTION|RECOMPLE,ENCRYPTION}] [FOR REPLICATION] AS sql_statement [,…n] 其中: ● procedure_name是新建存储过程的名称,其名称必须遵 守标识符命名规则,且对于数据库及其所有者必须唯一。 ● number是可选的整数,用来对同名的过程分组,以便用一 条DROP PROCEDURE语句即可将同组的过程一起删除。例如, 名为order的应用程序使用的过程可以命名为orderproc1、 orderproc2、orderproc3。DROP PROCEDURE orderproc语句 将删除整个组。如果名称中包含定界标识符,则数字不应该包含 在标识符中,只应在存储过程名前后使用适当的定界符。
【例9.3】在查询分析器中执行ST_PRO_BJ。 代码如下: USE student EXECUTE ST_PRO_BJ GO 其执行结果如图9-2所示。

MySQL中的触发器和存储过程的调试方法

MySQL中的触发器和存储过程的调试方法

MySQL中的触发器和存储过程的调试方法MySQL中的触发器和存储过程是开发中经常使用的功能。

它们可以帮助我们在数据库层面上实现复杂的业务逻辑和数据操作。

然而,当出现问题时,我们可能会遇到调试的困难。

在本文中,我们将讨论一些MySQL中触发器和存储过程的调试方法。

一、调试触发器1. 使用日志输出MySQL提供了一个用于输出日志的语句:SELECT、INSERT、UPDATE或DELETE语句的执行结果可以通过调用SELECT LAST_INSERT_ID()、ROW_COUNT()或FOUND_ROWS()函数来获取,并将这些结果写入到日志中。

通过在触发器中添加这些输出,我们可以追踪触发器的执行过程和结果。

2. 使用信号调试MySQL提供了信号机制,可以在触发器中使用SIGNAL语句来发送信号。

例如,我们可以在触发器中添加一行代码:SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'My debug message'。

当触发器执行到这行代码时,会发送一个45000状态的信号,并抛出一个异常。

我们可以通过捕获这个异常来获取触发器的调试信息。

3. 使用临时表有时候,我们希望在触发器中查看某些中间结果或变量的值。

为了实现这个目的,我们可以在触发器中创建一个临时表,并将值插入到这个表中。

然后,在调试的过程中,我们可以通过查询这个临时表来查看这些值。

二、调试存储过程1. 使用DECLARE语句在存储过程中,我们可以使用DECLARE语句来声明一个变量。

我们可以在存储过程的不同部分使用SELECT语句来打印变量的值。

通过在关键位置添加这些SELECT语句,我们可以在存储过程执行的过程中观察变量的变化。

2. 使用调试器MySQL提供了一个存储过程调试器,可以通过在存储过程中使用CALL DEBUG()语句来启动调试器。

调试器可以让我们逐步执行存储过程,并在每个步骤中查看变量的值和执行的语句。

第07章存储过程和触发器

第07章存储过程和触发器

山东工商学院
陈章良
7.1.2 用户存储过程的创建与执行
(2)存储过程的执行 语 法 格 式
[ EXEC [ UTE ] ] { [ @return_status = ] { procedure_name [ ;number ] | @procedure_name_var } [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] } [ ,...n ] [ WITH RECOMPILE ] }
山东工商学院
陈章良
7.1.4 用户存储过程的删除
语法格式
DROP PROCEDURE { procedure } [ ,...n ]
【例7.10】删除 PXSCJ数据库中的student_info1 存储过程。 USE PXSCJ GO DROP PROCEDURE student_info1
山东工商学院
CREATE PROCEDURE student_info AS SELECT a.xh,xm,kcm,cj,xf FROM XSB a JOIN CJB b ON a.xh=b.xh JOIN KCB t ON b.kch= t.kch GO
山东工商学院
陈章良
7.1.2 用户存储过程的创建与执行
3) 使用带OUTPUT参数的存储过程
山东工商学院
陈章良
7.1.2 用户存储过程的创建与执行
(3)举例 1) 设计简单的存储过程
【例7.1】从XSCJ USE PXSCJ 数据库的三个表中查 /*检查是否已存在同名的存储过程,若有,删除*/ 询,返回学生学号、 IF EXISTS (SELECT name FROM sysobjects WHERE name = 'student_info' AND type='P') 姓名、课程名、成绩、 DROP PROCEDURE student_info 学分。该存储过程不 GO 使用任何参数。 /*创建存储过程*/

存储过程和触发器

存储过程和触发器

实验存储过程和触发器实验一存储过程的创建和使用【实验目的】1.掌握存储过程的概念,了解存储过程的类型2.掌握创建各种存储过程的方法3.掌握执行存储过程的方法。

4.掌握查看,修改,删除存储过程的方法【实验内容】1.在SSMS图形化界面下创建对表Customers进行插入,修改和删除的3个存储过程:insertCustomers、updateCustomers、deleteCustomers.2.在查询分析其中创建一个存储过程,要求输入作者的姓和名,如果存在,则返回这个作者以及作者所出版的书的信息,否则给出相应的提示信息。

3.用系统存储过程查看刚创建的存储过程的信息。

4.删除存储过程【实验主要步骤】1.在SSMS图形化界面下创建对表Customers进行插入,修改和删除的3个存储过程:insertCustomers、updateCustomers、deleteCustomers.2.在查询分析其中创建一个存储过程,要求输入作者的姓和名,如果存在,则返回这个作者以及作者所出版的书的信息,否则给出相应的提示信息。

3.用系统存储过程查看刚创建的存储过程的信息。

4.删除存储过程实验二触发器的创建和使用【实验目的】1.理解触发器的概念与类型。

2.理解触发器的功能及工作原理。

3.掌握创建、修改和删除触发器的方法。

4.掌握利用触发器维护数据完整性的方法。

【实验内容】触发器是一种实施复杂数据完整性的特殊存储过程,在对表或视图执行UPDATE、INSERT、DELETE语句时自动触发执行,以防止对数据不正确、未授权或不一致的修改。

1.使用T-SQL语句创建一个DELETE触发器,完成的功能是当在Categories表中删除记录时,检测Products表中是否存在相关记录,如果存在,则给出提示信息“不能删除该条记录”;如果不存在,则删除该条记录。

2.基于Sales表创建一个触发器,针对INSERT、DELETE、UPDATE操作。

触发器与存储过程

触发器与存储过程

触发器与存储过程触发器(Trigger)是数据库中的一种特殊对象,它与一些特定的数据库事件相关联,并且当这个事件发生时,触发器可以在自动执行的过程中被触发。

而存储过程(Stored Procedure)则是一段预先编译好的SQL 语句的集合,它可以被保存在数据库服务器端,通过调用来执行。

触发器和存储过程都是数据库中的重要组件,它们都可以用于实现数据的自动化处理和一些复杂的业务逻辑。

但是它们在功能和使用方法上有一些不同之处。

首先,触发器的触发条件是事先设置好的,当该条件满足时才会被触发执行,而存储过程是主动调用执行的。

触发器通常与数据库中的表相关联,并且在表上的插入、更新或删除等事件发生时触发。

存储过程可以在任何时候被调用执行,无论是否有其他数据库事件发生。

其次,触发器通常用于实现数据的自动化处理,比如在插入新纪录时通过触发器自动计算一些字段的值,或者在删除记录时触发器做一些相关操作。

而存储过程则更倾向于实现业务逻辑的封装和复用,比如在一个库存管理系统中,可以使用存储过程来实现添加商品、修改商品信息、删除商品等操作。

此外,触发器由数据库引擎直接管理,它是与数据库表密切相关的一种对象,所以当表被删除或者修改时,相关联的触发器也会相应地被删除或修改。

而存储过程则是作为独立于表的对象存在,当数据库表被删除或修改时,存储过程不受影响。

在使用上,触发器和存储过程都可以用于实现一些相同的功能,但触发器更适合于在特定的数据库事件发生时执行自动化的操作,而存储过程更适合于实现复杂的业务逻辑和一些需要主动调用的场景。

总之,触发器和存储过程都是数据库中的重要组件,它们可以用于实现一些自动化的处理和复杂的业务逻辑。

它们在功能和使用方法上有一些不同之处,需要根据具体的需求来选择和使用。

触发器和存储过程

触发器和存储过程
应用1 应用2 应用N
DBMS
OS
DB
由于要设计自己的多任务处理机制和调度算法, 使得N+1方案的DBMS设计在整体上比2N方案要复杂。
Server要处理所有用户的申请,如果调度策略不当或
不能使数据库进程获得较高的优先权,这种方案将导 致瓶颈。 另外,N+1方案中要用到操作系统级的消息机制 以实现多进程向单进程以及单进程向多进程的数据传
针对强制关联关系, 建立触发器。
注意引用完整性
数据录入、修改
数据查询、报表
View
存储过程
T_student
T_teacher
T_Course
T_grade
触发器
三、 DBMS的基本功能和系统结构
1、DBMS的基本功能
◆ 数据库定义
对数据库的结构进行描述,包括外模式、模式、 内模式的定义;数据库完整性的定义;安全保密定义 (如用户口令、级别、存取权限);存取路径 (如索引)
2、设计有效索引 注 意:如果一项查询中,需访问表中多于20%的行, 则使用表扫描比使用索引效率高。 使用索引的指导方针:
● 适量使用索引 ● 不要索引较小的表(比如只有几百行) ● 尽可能使用较少的索引键列
● 尽可能使用覆盖查询(即查询内容包含于索引列
中,则只有索引被访问,表本身被“绕”过)
数据库设计中需要深入考虑的问题
的结果。
存储过程潜在的缺点如下:
1、难以保持负荷平衡。
存储过程提出了一种在服务器上集中处理的模型,
用集中处理代替事务的分布处理。这种方法,除非服 务器的性能进行了优化,符合存储过程运行的需求, 否则它会降低服务器的性能。 2、增加了管理要求。
存储过程是一个共享的资源。管理员必须确保使

存储过程与触发器概念及应用考试

存储过程与触发器概念及应用考试

存储过程与触发器概念及应用考试(答案见尾页)一、选择题1. 存储过程是什么?A. 一种数据库对象,用于存储逻辑操作B. 一种数据库对象,用于存储查询语句C. 一种数据库对象,用于存储流程控制语句D. 一种数据库对象,用于存储数据2. 触发器的作用是什么?A. 在数据库中插入、更新或删除数据前自动执行的程序B. 在数据库中创建、修改或删除表C. 用于数据完整性约束D. 用于权限管理3. 存储过程和触发器都存放在以下哪个对象中?A. 数据库B. 表C. 索引D. 视图4. 存储过程可以通过哪种方式调用?A. SQL语句B. 外部程序调用C. 内部程序调用D. 以上都是5. 触发器的类型有哪几种?A. INSERT触发器B. UPDATE触发器C. DELETE触发器D. ALL触发器6. 触发器的工作原理是在哪个事件发生时执行?A. 数据库打开时B. 数据库关闭时C. 数据被插入、更新或删除时D. 用户登录时7. 如何创建一个存储过程?A. 使用CREATE PROCEDURE语句B. 使用CREATE TABLE语句C. 使用ALTER TABLE语句D. 使用CREATE INDEX语句8. 触发器中的IF语句用于做什么?A. 进行条件判断B. 控制触发器的执行流程C. 计算数据D. 存储数据9. 在触发器中,哪个关键字表示不执行任何操作?A. ALLB. EXCEPTIONC. THEND. ELSE10. 触发器的执行顺序是怎样的?A. 从内到外,从上到下B. 从内到外,从下到上C. 从外到内,从上到下D. 从外到内,从下到上11. 触发器的功能是什么?A. 处理数据库中的数据完整性问题B. 执行数据库中的批量操作C. 监控数据库中的数据变化,并在特定事件发生时自动执行操作D. 管理数据库中的用户权限12. 存储过程与触发器都是数据库对象,它们的主要区别是什么?A. 存储过程用于存储查询结果,而触发器用于执行操作B. 存储过程可以有输入参数,而触发器不能C. 存储过程是预编译的,可以提高数据库性能,而触发器是运行时执行的D. 触发器只能由用户触发,而存储过程可以由任何具有权限的用户调用13. 下列哪个不是存储过程的特点?A. 可以接收参数B. 可以有多个输出参数C. 只能在数据库内部执行D. 可以直接修改数据库中的数据14. 触发器通常与哪个对象相关联?A. 数据库表B. 数据库视图C. 数据库索引D. 数据库存储过程15. 在MySQL中,触发器的类型有哪些?A. INSERT触发器B. UPDATE触发器C. DELETE触发器D. SELECT触发器16. 触发器的工作原理是什么?A. 当对触发器关联的数据表进行指定类型的操作时,触发器自动执行预定义的操作B. 当数据库服务器启动时,触发器自动执行C. 当有新的连接连接到数据库时,触发器自动执行D. 当有用户登录到数据库时,触发器自动执行17. 如何在MySQL中创建一个存储过程?A. 使用CREATE PROCEDURE语句B. 使用CREATE FUNCTION语句C. 使用ALTER PROCEDURE语句D. 使用ALTER FUNCTION语句18. 触发器中可以使用哪些类型的条件判断?A. IF...ELSE语句B. CASE语句C. THEN...ELSE语句D. ALL...IN语句19. 触发器可以分为几种类型?(多选)A. INSERT触发器B. UPDATE触发器C. DELETE触发器D. SELECT触发器20. 存储过程和触发器都存放在哪种类型的数据库对象中?A. 表B. 序列C. 索引D. 视图21. 存储过程的类型有哪几种?A. 标准存储过程B. 用户定义存储过程C. 扩展存储过程D. 内置存储过程22. 下列哪个不是存储过程中的控制结构?A. IF...ELSEB. WHILEC. CASED. GOTO23. 触发器在什么情况下会被触发?A. 当表被添加或修改时B. 当数据库连接打开时C. 当用户登录时D. 当执行特定SQL语句时24. 如何使用存储过程?A. 使用CREATE PROCEDURE语句创建存储过程B. 使用ALTER PROCEDURE语句修改存储过程C. 使用DROP PROCEDURE语句删除存储过程D. 以上都是25. 触发器的主要优点是什么?A. 提高数据库性能B. 减少数据库维护成本C. 增加数据库安全性D. 以上都是26. 触发器的主要缺点是什么?A. 可能导致数据库性能下降B. 可能导致数据库死锁C. 可能导致数据库崩溃D. 可能导致数据库锁定二、问答题1. 什么是存储过程?请简述其特点。

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

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

存储过程与触发器实验报告本实验旨在探究存储过程与触发器的概念、作用、使用范围和创建过程,并且通过编写相关的示例代码来展示它们的实际应用。

一、实验原理1. 存储过程存储过程是一组预定义好的 SQL 语句,可以重复使用并且可以直接被调用。

它类似于程序中的函数,可以接受参数、返回值、流程控制等。

2. 触发器触发器是与数据库表相关的事件响应机制,可以在数据库表上定义一些触发条件,当满足这些条件时就会触发执行一些操作,比如插入、更新或删除数据。

二、实验步骤1. 存储过程的创建与使用(1)创建一个用于统计某个用户的订单数量的存储过程。

```DELIMITER //CREATE PROCEDURE `getOrderCount`(IN p_userid INT, OUTp_count INT)BEGINSELECT COUNT(*) INTO p_count FROM orders WHERE user_id = p_userid;END//DELIMITER ;```(2)调用这个存储过程,并输出结果。

```CALL getOrderCount(123, @count);SELECT @count AS 'order_count';```2. 触发器的创建与使用(1)创建一个在用户表中插入新记录时自动生成一个账户记录的触发器。

```DELIMITER //CREATE TRIGGER `insert_user_account` AFTER INSERT ON `users` FOR EACH ROWBEGININSERT INTO accounts (user_id, balance) VALUES (NEW.id, 0);END//DELIMITER ;```(2)在用户表中插入一条新记录,触发器会自动执行并在账户表中生成一条新记录。

```INSERT INTO users (name, email) VALUES ('Alice','***************');SELECT * FROM accounts WHERE user_id =LAST_INSERT_ID();```三、实验结论通过实验我们发现,存储过程可以将一些常用的 SQL 语句封装为一个可以重复调用的函数,使得程序更加简洁和高效。

数据库的一些基本概念(视图,存储过程,函数,触发器)

数据库的一些基本概念(视图,存储过程,函数,触发器)

数据库的⼀些基本概念(视图,存储过程,函数,触发器)⼀、视图视图定义视图是从⼀个或⼏个基本表(或视图)中导出的虚拟的可视化的表。

在系统的数据字典中仅存放了视图的定义,不存放视图对应的数据。

视图特点安全:有的数据是需要保密的,如果直接把表给出来进⾏操作会造成泄密,那么可以通过创建视图把相应视图的权限给出来即可保证数据的安全。

⾼效:复杂的连接查询,每次执⾏时效率⽐较低,可以考虑新建视图,每次从视图中获取,将会提⾼效率。

定制数据:将常⽤的字段放置在视图中。

使⽤视图不会加快数据查询速度。

⼆、存储过程存储过程(Stored Procedure)是在⼤型数据库系统中,⼀组为了完成特定功能的SQL 语句集,存储在数据库中,经过第⼀次编译后调⽤不需要再次编译,⽤户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执⾏它。

存储过程是数据库中的⼀个重要对象。

优点存储过程的能⼒⼤⼤增强了SQL语⾔的功能和灵活性。

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

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

存储过程可以使相关的动作在⼀起发⽣,从⽽可以维护数据库的完整性。

在运⾏存储过程前,数据库已对其进⾏了语法和句法分析,并给出了优化执⾏⽅案。

这种已经编译好的过程可极⼤地改善SQL语句的性能。

可以降低⽹络的通信量。

使体现企业规则的运算程序放⼊数据库服务器中,以便集中控制。

三、函数在数据库中都有函数,这些函数属于系统函。

除此之外⽤户也可以编写⽤户⾃定义函数。

⽤户定义函数是存储在数据库中的代码块,可以把值返回到调⽤程序。

调⽤时如同系统函数⼀样,如max(value)函数,其value被称为参数。

函数⼀般功能⽐较简单,对于mysql函数只有传⼊参数,不像存储过程⼀样,有输⼊输出参数。

数据库函数特点如下:存储函数将向调⽤者返回⼀个且仅返回⼀个结果值。

存储函数嵌⼊在sql中使⽤的,可以在select中调⽤,就像内建函数⼀样,⽐如cos()、hex()。

实验6 大数据库实验——存储过程和触发器

实验6 大数据库实验——存储过程和触发器

实验6 存储过程和触发器一、实验目的1、加深和巩固对存储过程和触发器概念的理解。

2、掌握触发器的简单应用。

3、掌握存储过程的简单应用。

二、实验容一)存储过程:1. 创建一存储过程,求l+2+3+…+n,并打印结果。

CREATE PROCEDURE addresultASDECLARE n int=10,/*最后一个数*/i int=0,result int=0 /*结果*/BEGINWHILE(i<=n)BEGINSET result=result+iSET i=i+1ENDPRINT'1+2+3+...+n的结果是:'PRINT resultRETURN(result)ENDGO2.调用上面的addresult存储过程,打印l十2+3+…+10的结果。

EXEC addresult3. 修改上述存储过程为addresult1,使得n为输入参数,其具体值由用户调用此存储过程时指定。

CREATE PROCEDURE addresult1n int=10 /*最后一个数*/ASDECLARE i int=0,result int=0 /*结果*/BEGINWHILE(i<=n)BEGINSET result=result+iSET i=i+1ENDPRINT'1+2+3+...+n的结果是:'PRINT resultRETURN(result)ENDGO4. 调用上面修改后的addresult1存储过程,打印l+2+3+…+100的结果。

EXEC addresult1 1005.修改上述存储过程为addresult2,将n参数设定默认值为10,并改设sum为输出参数,让主程序能够接收计算结果。

CREATE PROCEDURE addresult2n int=10,/*最后一个数*/sum int out/*结果*/ASDECLARE i int=0BEGINset sum=0WHILE(i<=n)BEGINSET sum=sum+iSET i=i+1ENDENDGO6.调用上面修改后的addresult2存储过程,设置变量s接收计算l+2+3+…+10的结果。

SQL_TP8_存储过程和触发器

SQL_TP8_存储过程和触发器

20
触发器及分类
按照触发事件的不同 DML触发器 当数据库中发生数据操纵语言(DML)事件时将调 用DML触发器。DML事件包括在指定表上或视图上发生 修改数据的INSERT、UPDATE、DELETE操作。 DDL触发器 当数据库中发生数据定义语言(DDL)事件时将调 用DDL触发器。DDL事件包括CREATE、ALTER、 DROP操作。 按照被激活的时机不同 DML触发器又分AFTER触发器和INSTEAD OF触发器。 INSTEAD OF触发器用于替代引起触发器执行的T-SQL 语句。INSTEAD OF触发器可用于表和视图。 AFTER触发器在INSERT、UPDATE或DELETE操作之 后执行,进行约束检查等动作都将在AFTER触发器被激 活之前发生,AFTER触发器只能用于表。
11
存储过程的参数
输入参数—实现带参数的视图 【例】 使用输入参数,查询指定姓名的读者借阅书籍信息。 CREATE PROCEDURE borrowed_books1 @name varchar(8) AS SELECT Readers.Rname, Readers.Rid, Books.Bid, 将实参值传给存储过程的方法: • Books.Btitle, 直接将值传入。 Borrowinfo.BB_date, Borrowinfo.BG_date EXEC borrowed_books1 '刘超' FROM Books INNER JOIN Borrowinfo • 利用变量传递。 DECLARE @tempname VARCHAR(8) ON Books.Bid = Borrowinfo.BBid INNER JOIN Readers SET @tempname='刘超' ON Borrowinfo.BRid = Readers.Rid EXEC Readers.Rname = @name WHERE borrowed_books1 @tempname • 使用参数名进行传递。 EXEC borrowed_books1 @name='刘超'

MySQL中的触发器与存储过程对比

MySQL中的触发器与存储过程对比

MySQL中的触发器与存储过程对比引言:MySQL是一款非常流行的关系型数据库管理系统,它提供了丰富的功能和工具来支持开发人员进行数据处理和管理。

在MySQL中,触发器和存储过程是两种常用的功能。

触发器是一种在表上定义的操作,当满足特定的条件时,MySQL会自动执行触发器中的动作。

而存储过程是一组预定义的SQL语句集合,可以在需要时执行。

本文将对MySQL中的触发器和存储过程进行对比,探讨它们的相似之处和差异。

一、触发器1.1 触发器的定义和语法MySQL中的触发器是与表相关联的特殊程序,当满足特定条件时,自动触发执行。

触发器通常用于维护表之间的一致性和完整性。

在MySQL中,触发器使用CREATE TRIGGER语句进行定义,语法如下所示:```CREATE TRIGGER trigger_name trigger_time trigger_eventON table_nameFOR EACH ROWtrigger_body;```其中,trigger_name是触发器的名称,trigger_time是触发器的时间,可以是BEFORE或AFTER,trigger_event是触发器的事件,可以是INSERT、UPDATE或DELETE,table_name是触发器所属的表名,trigger_body是触发器的执行内容。

1.2 触发器的优点(1)自动执行:触发器能够根据特定的条件自动执行,无需手动干预,提高了数据的处理效率。

(2)数据一致性和完整性:通过触发器,可以对表的数据进行一些限制和验证,确保数据的一致性和完整性。

(3)简化应用程序代码:触发器可以在数据库层面执行一些复杂的操作,减少了应用程序的代码量。

1.3 触发器的缺点(1)难以调试:触发器是在特定条件下自动执行的,难以进行调试和错误定位。

(2)性能开销:触发器的执行会占用一定的系统资源,可能对数据库的性能产生影响。

(3)复杂性:由于触发器的执行是隐式的,对数据库开发人员而言,某些操作可能不直观,增加了开发的复杂性。

存储过程和触发器实验心得

存储过程和触发器实验心得

存储过程和触发器实验心得1、PLSQL创建储存过程编译出错不会给出错误提示,导致调用时提示储存过程处于无效状态。

解决方案:使用SQLPLUS,不过SQLPLUS只会提示编译错误,不会提示具体原因,还可以使用Navicat工具,Navicat会给出更加详细的错误原因。

2、创建储存过程时,设置变量参数类型时,指定了字符长度导致创建失败。

解决方案:直接设置变量数据类型,不设置其字符长度。

3、使用TO_DATE(SYSDATE,‘YYYY/MM/DD’)获取当前日期作为借阅日期导致调用借书储存过程失败,提示参数类型错误。

解决方案:因为TO_DATE()函数是将字符类型转换成日期类型,而SYSDATE本来就是日期类型,所以导致调用失败,使用TO_DATE(TO_CHAR(SYSDATE,‘YYYY/MM/DD’),‘YYYY/MM/DD ’)将SYSDATE转换成字符类型再转换成日期类型。

4、使用DBMS_OUTPUT.PUT_LINE()函数输出提示,没有反应。

解决方案:在SQLPLUS中需要先使用SET SERVEROUTPUT ON;打开输出模式才能看见输出,而在PLSQL中输出的内容在另一个Output窗口中,而不是没有反应。

5、创建自动递增借阅流水号的触发器时,使用NEW关键字改变借阅流水号,导致创建触发器失败,解决方案:使用NEW关键字时,需要在前面加一个“:”号,如“:NEW.借阅流水号”。

6、调用修改后的借书储存过程时,发送错误,提示违反唯一约束条件以及COMMIT;不能再触发器中使用。

解决方案:删除在触发器中的COMMIT;,然后删除序列“借阅流水号序列”,重新创建序列“借阅流水号序列”,并且设置初始值为8,因为借阅表中已经有借阅流水号1到7的数据了,然后创建序列时未指定初始值,序列默认从1开始,导致违反唯一约束条件,从而导致调用储存过程失败。

四、实验心得体会通过本次实验,学会了储存过程以及触发器和序列的使用方法,对存储过程有了一个直观的认识,对触发器的工作原理和作用有了更加深刻的认识,使用触发器可以在修改数据前后规范数据,使数据规范化和标准化。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Oracle触发器与存储过程[转]触发器是特定事件出现的时候,自动执行的代码块。

类似于存储过程,但是用户不能直接调用他们。

功能:1、允许/限制对表的修改2、自动生成派生列,比如自增字段3、强制数据一致性4、提供审计和日志记录5、防止无效的事务处理6、启用复杂的业务逻辑开始create trigger biufer_employees_department_idbefore insert or updateof department_idon employeesreferencing old as old_valuenew as new_valuefor each rowwhen (new_value.department_id<>80 )begin:new_mission_pct :=0;end;/触发器的组成部分:1、触发器名称2、触发语句3、触发器限制4、触发操作1、触发器名称create trigger biufer_employees_department_id命名习惯:biufer(before insert update for each row)employees 表名department_id 列名2、触发语句比如:表或视图上的DML语句DDL语句数据库关闭或启动,startup shutdown 等等before insert or updateof department_idon employeesreferencing old as old_valuenew as new_valuefor each row说明:1、无论是否规定了department_id ,对employees表进行insert的时候2、对employees表的department_id列进行update的时候3、触发器限制when (new_value.department_id<>80 )限制不是必须的。

此例表示如果列department_id不等于80的时候,触发器就会执行。

其中的new_value是代表跟新之后的值。

4、触发操作是触发器的主体begin:new_mission_pct :=0;end;主体很简单,就是将更新后的commission_pct列置为0触发:insert into employees(employee_id,last_name,first_name,hire_date,job_id,email,department_id,salary,commissio n_pct )values( 12345,’Chen’,’Donny’, sysdate, 12,‘donny@’,60,10000,.25);select commission_pct from employees where employee_id=12345;触发器不会通知用户,便改变了用户的输入值。

触发器类型:1、语句触发器2、行触发器3、 INSTEAD OF 触发器4、系统条件触发器5、用户事件触发器1、语句触发器是在表上或者某些情况下的视图上执行的特定语句或者语句组上的触发器。

能够与INSERT、UPDATE、DELETE或者组合上进行关联。

但是无论使用什么样的组合,各个语句触发器都只会针对指定语句激活一次。

比如,无论update多少行,也只会调用一次update语句触发器。

例子:需要对在表上进行DML操作的用户进行安全检查,看是否具有合适的特权。

Create table foo(a number);Create trigger biud_fooBefore insert or update or deleteOn fooBeginIf user not in (‘DONNY’) thenRaise_application_error(-20001, ‘You don’t have access to modify this table.’);End if;End;/即使SYS,SYSTEM用户也不能修改foo表[试验]对修改表的时间、人物进行日志记录。

1、建立试验表create table employees_copy as select *from hr.employees2、建立日志表create table employees_log(who varchar2(30),when date);3、在employees_copy表上建立语句触发器,在触发器中填充employees_log 表。

Create or replace trigger biud_employee_copyBefore insert or update or deleteOn employees_copyBeginInsert into employees_log(Who,when)Values( user, sysdate);End;/4、测试update employees_copy set salary= salary*1.1;select *from employess_log;5、确定是哪个语句起作用?即是INSERT/UPDATE/DELETE中的哪一个触发了触发器?可以在触发器中使用INSERTING / UPDATING / DELETING 条件谓词,作判断:beginif inserting then-----elsif updating then-----elsif deleting then------end if;end;if updating(‘COL1’) or updating(‘COL2’) then------end if;[试验]1、修改日志表alter table employees_logadd (action varchar2(20));2、修改触发器,以便记录语句类型。

Create or replace trigger biud_employee_copyBefore insert or update or deleteOn employees_copyDeclareL_action employees_log.action%type;Beginif inserting thenl_action:=’Insert’;elsif updating thenl_action:=’Update’;elsif deleting thenl_action:=’Delete’;elseraise_application_error(-20001,’You should never ever get this error.’);Insert into employees_log(Who,action,when)Values( user, l_action,sysdate);End;/3、测试insert into employees_copy( employee_id, last_name, email, hire_date, job_id) values(12345,’Chen’,’Donny@hotmail’,sysdate,12);select *from employees_logupdate employees_copy set salary=50000 where employee_id = 12345;2、行触发器是指为受到影响的各个行激活的触发器,定义与语句触发器类似,有以下两个例外:1、定义语句中包含FOR EACH ROW子句2、在BEFORE……FOR EACH ROW触发器中,用户可以引用受到影响的行值。

比如:定义:create trigger biufer_employees_department_idbefore insert or updateof department_idon employees_copyreferencing old as old_valuenew as new_valuefor each rowwhen (new_value.department_id<>80 )begin:new_mission_pct :=0;end;/Referencing 子句:执行DML语句之前的值的默认名称是:old ,之后的值是:newinsert 操作只有:newdelete 操作只有:oldupdate 操作两者都有referencing子句只是将new 和old重命名为new_value和old_value,目的是避免混淆。

比如操作一个名为new的表时。

作用不很大。

[试验]:为主健生成自增序列号drop table foo;create table foo(id number, data varchar2(20));create sequence foo_seq;create or replace trigger bifer_foo_id_pkbefore insert on foofor each rowbeginselect foo_seq.nextval into :new.id from dual;end;/insert into foo(data) values(‘donny’);insert into foo values(5,’Chen’);select * from foo;3、 INSTEAD OF 触发器更新视图Create or replace view company_phone_book asSelect first_name||’, ’||last_n ame name, email, phone_number,employee_id emp_idFrom hr.employees;尝试更新email和nameupdate pany_phone_bookset name=’Chen1, Donny1’where emp_id=100create or replace trigger update_name_company_phone_bookINSTEAD OFUpdate on pany_phone_bookBeginUpdate hr.employeesSet employee_id=:new.emp_id,First_name=substr(:, instr(:,’,’)+2),last_name= substr(:,1,instr(:,’,’)-1),phone_number=:new.phone_number,email=:new.emailwhere employee_id=:old.emp_id;end;4、系统事件触发器系统事件:数据库启动、关闭,服务器错误create trigger ad_startupafter startupon databasebegin-- do some stuffend;/5、用户事件触发器用户事件:用户登陆、注销,CREATE / ALTER / DROP / ANALYZE / AUDIT / GRANT / REVOKE / RENAME / TRUNCATE / LOGOFF例子:记录删除对象1. 日志表create table droped_objects(object_name varchar2(30),object_type varchar2(30),dropped_on date);2.触发器create or replace trigger log_drop_triggerbefore drop on donny.schemabegininsert into droped_objects values(ora_dict_obj_name, -- 与触发器相关的函数ora_dict_obj_type,sysdate);end;/3. 测试create table drop_me(a number);create view drop_me_view as select *from drop_me; drop view drop_me_view;drop table drop_me;select *from droped_objects禁用和启用触发器alter trigger <trigger_name> disable;alter trigger <trigger_name> enable;事务处理:在触发器中,不能使用commit / rollback因为ddl语句具有隐式的commit,所以也不允许使用oracle 存储过程的基本语法 2007-4-19 动态网站制作指南(1834)1.基本结构CREATE OR REPLACE PROCEDURE 存储过程名字(参数1 IN NUMBER,参数2 IN NUMBER) IS变量1 INTEGER :=0;变量2 DATE;BEGINEND 存储过程名字2.SELECT INTO STATEMENT将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)例子:BEGINSELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx; EXCEPTIONWHEN NO_DATA_FOUND THENxxxx;END;...3.IF 判断IF V_TEST=1 THENBEGINdo somethingEND;END IF;4.while 循环WHILE V_TEST=1 LOOPBEGINXXXXEND;END LOOP;5.变量赋值V_TEST := 123;6.用for in 使用cursor...ISCURSOR cur IS SELECT * FROM xxx;BEGINFOR cur_result in cur LOOPBEGINV_SUM :=cur_result.列名1+cur_result.列名2END;END LOOP;END;7.带参数的cursorCURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID;OPEN C_USER(变量值);LOOPFETCH C_USER INTO V_NAME;EXIT FETCH C_USER%NOTFOUND;do somethingEND LOOP;CLOSE C_USER;8.用pl/sql developer debug连接数据库后建立一个Test WINDOW在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试存储过程基本的语法都已经讲过了,是不是很想试试手啊,不急,我们来看看下面的:【转自】/AXzhz/archive/2006/09/20/510007.html①为什么要使用存储过程?因为它比SQL语句执行快.②存储过程是什么?把一堆SQL语句罗在一起,还可以根据条件执行不通SQL语句.(AX写作本文时观点)③来一个最简单的存储过程CREATE PROCEDURE dbo.testProcedure_AXASselect userID from USERS order by userid desc注:dbo.testProcedure_AX是你创建的存储过程名,可以改为:AXzhz等,别跟关键字冲突就行了.AS下面就是一条SQL语句,不会写SQL语句的请回避.④我怎么在中调用这个存储过程?下面黄底的这两行就够使了.public static string GetCustomerCName(ref ArrayList arrayCName,ref ArrayList arrayID){SqlConnection con=ADConnection.createConnection();SqlCommand cmd=new SqlCommand("testProcedure_AX",con);mandType=CommandType.StoredProcedure;con.Open();try{SqlDataReader dr=cmd.ExecuteReader();while(dr.Read()){if(dr[0].ToString()==""){arrayCName.Add(dr[1].ToString());}}con.Close();return "OK!";}catch(Exception ex){con.Close();return ex.ToString();}}注:其实就是把以前SqlCommand cmd=new SqlCommand("select userID from USERS order by userid desc",con);中的SQL语句替换为存储过程名,再把cmd的类型标注为CommandType.StoredProcedure(存储过程)⑤写个带参数的存储过程吧,上面这个简单得有点惨不忍睹,不过还是蛮实用的. 参数带就带两,一个的没面子,太小家子气了.CREATE PROCEDURE dbo.AXzhz/*这里写注释*/@startDate varchar(16),@endDate varchar(16)ASselect id from table_AX where commentDateTime>@startDate and commentDateTime<@endDate order by contentownerid DESC注:@startDate varchar(16)是声明@startDate 这个变量,多个变量名间用【,】隔开.后面的SQL就可以使用这个变量了.⑥我怎么在中调用这个带参数的存储过程?public static string GetCustomerCNameCount(string startDate,string endDate,ref DataSet ds){SqlConnection con=ADConnection.createConnection();//-----------------------注意这一段-------------------------------------------------------------- SqlDataAdapter da=new SqlDataAdapter("AXzhz",con);para0=new SqlParameter("@startDate",startDate);para1=new SqlParameter("@endDate",endDate);da.SelectCommand.Parameters.Add(para0);da.SelectCommand.Parameters.Add(para1);mandType=CommandType.StoredProcedur e;//----------------------------------------------------------------------------------------------- try{con.Open();da.Fill(ds);con.Close();return "OK";}catch(Exception ex){return ex.ToString();}}注:把命令的参数添加进去,就OK了鸟的,改字体颜色的东西太垃圾了,改不好,大家凑活着看.⑦我还想看看SQL命令执行成功了没有.注意看下面三行红色的语句CREATE PROCEDURE dbo.AXzhz/*@parameter1 用户名@parameter2 新密码*/@password nvarchar(20),@userName nvarchar(20)ASdeclare @err0 intupdate WL_user set password=@password where UserName=@userName set @err0=@@errorselect @err0 as err0注:先声明一个整型变量@err0,再给其赋值为@@error(这个是系统自动给出的语句是否执行成功,0为成功,其它为失败),最后通过select把它选择出来,某位高人说可以通过Return返回,超出本人的认知范围,俺暂时不会,以后再补充吧⑧那怎么从后台获得这个执行成功与否的值呢?下面这段代码可以告诉你答案:public static string GetCustomerCName(){SqlConnection con=ADConnection.createConnection();SqlCommand cmd=new SqlCommand("AXzhz",con);mandType=CommandType.StoredProcedure;para0=new SqlParameter("@startDate","2006-9-10");para1=new SqlParameter("@endDate","2006-9-20");da.SelectCommand.Parameters.Add(para0);da.SelectCommand.Parameters.Add(para1);con.Open();try{Int32 re=(int32)cmd.ExecuteScalar();con.Close();if (re==0)return "OK!";elsereturn "false";}catch(Exception ex){con.Close();return ex.ToString();}}注:就是通过SqlCommand的ExecuteScalar()方法取回这个值,这句话是从MSDN上找的,俺认为改成:int re=(int)cmd.ExecuteScalar(); 99%正确,现在没时间验证,期待您的测试!!!⑨我要根据传入的参数判断执行哪条SQL语句!!~下面这个存储过程可以满足我们的要求,竟然是Pascal/VB的写法,Begin----End ,不是{},,,对使用C#的我来说,这个语法有点恶心.........ALTER PROCEDURE dbo.selectCustomerCNameCount@customerID intASif @customerID=-1beginselect contentownerid ,userCName,count(*) as countAll fromview_usercomment group by contentownerid,userCName order by contentownerid DESCendelsebeginselect contentownerid ,userCName,count(*) as countAll fromview_usercomment where contentownerid=@customerID group by contentownerid,userCName order by contentownerid DESCend好了,俺的水平只止于此,也够菜鸟们喝一壶的了,还有更多东西等着我们去发现,无尽的征途!!!!!!!!!!!下面是存储过程的调用方式:存储过程包含三部分:声明,执行部分,异常。

相关文档
最新文档