存储过程

一个简单的存储过程使用事务的例子

假装没事ソ 提交于 2019-12-22 19:05:38
在存储过程中使用事务时非常重要,使用数据库可以保持数据的关联完整性,在SQL Server存储过程中使用事务也很简单,举个例子: Create Procedure MyProcedure ( @Param1 nvarchar(10), @Param2 nvarchar(10) ) AS Begin Set NOCUNT ON; Set XACT_ABORT on; Begin Tran Delete from table1 where name='abc'; insert into table2 values(value1,value2,value3); Commit Tran End 说明:1、使用存储过程执行事务,需要开启XACT_ABORT参数(默认值Off),将该参数设置On,表示当执行事务时,如果出错,会将transcation设置为uncommittable状态,那么在语句块批处理结束后;如果该参数设置为Off,表示当执行事务时,如果出错,出错的语句将不会执行,其他正确的操作继续执行。 2、当Set Nocunt为ON时,不返回计数(计数表示受Transact-SQL语句影响的行数,例如在SQL Server查询分析器中执行一个Delete操作后,下方窗口提示(3) Rows Affeted)。当Set NOCOUNT 为OFF时,返回计数

存储过程中使用事务

牧云@^-^@ 提交于 2019-12-22 15:00:56
一、存储过程中使用事务的简单语法 在存储过程中使用事务时非常重要的,使用数据可以保持数据的关联完整性,在Sql server存储过程中使用事务也很简单,用一个例子来说明它的语法格式: 代码 Create Procedure MyProcedure ( @Param1 nvarchar(10), @param2 nvarchar(10) ) AS Begin Set NOCOUNT ON; Set XACT_ABORT ON; Begin Tran Delete from table1 where name=’abc’; Insert into table2 values(value1,value2,value3); Commit Tran End 说明:1 、使用存储过程执行事物,需要开启XACT_ABORT参数(默认值为Off),将该参数设置为On,表示当执行事务时,如果出错,会将transcation设置为uncommittable状态,那么在语句块批处理结束后将回滚所有操作;如果该参数设置为Off,表示当执行事务时,如果出错,出错的语句将不会执行,其他正确的操作继续执行。 2、当SET NOCOUNT 为 ON 时,不返回计数(计数表示受 Transact-SQL 语句影响的行数,例如在Sql server查询分析器中执行一个delete操作后,下方窗口会提示(3)Rows

SQL Server UDF用户自定义函数

柔情痞子 提交于 2019-12-22 14:50:51
UDF的定义   和存储过程很相似,用户自定义函数也是一组有序的T-SQL语句,UDF被预先优化和编译并且尅作为一个单元爱进行调用。UDF和存储过程的主要区别在于返回结果的方式。   使用UDF时可传入参数,但不可传出参数。输出参数的概念被更为健壮的返回值取代了。和系统函数一样,可以返回标量值,这个值的好处是它并不像在存储过程中那样只限于整形数据类型,而是可以返回大多数SQL Server数据类型。   UDF有以下两种类型:   返回标量值的UDF。   返回表的UDF。   创建语法: CREATE FUNCTION [<schema name>.]<function name> ( [ <@parameter name> [AS] [<schema name>.]<data type> [= <default value> [READONLY]] [,...n] ] ) RETURNS { <scalar type> | TABLE [(<table definition>)] } [ WITH [ENCRYPTION] | [SCHEMABINDING] | [RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ] | [EXECUTE AS {CALLER|SELF|OWNER|<'user name'>}] [AS] {

转:EF调用存储过程、函数

ε祈祈猫儿з 提交于 2019-12-22 00:58:15
public int AddVote( int titleId, int blockId, int typeId) { List<SqlParameter> paramArray = new List<SqlParameter>(); paramArray.Add( new SqlParameter( "@titleId", titleId)); paramArray.Add( new SqlParameter( "@blockId", blockId)); paramArray.Add( new SqlParameter( "@typeId", typeId)); SqlParameter param = new SqlParameter( "@num", SqlDbType.Int); param.Direction = ParameterDirection.Output; paramArray.Add(param); using (RPDBContext db = new RPDBContext()) { try { db.Database.ExecuteSqlCommand( "EXEC [AddVote] @blockId,@titleId,@typeId,@num out", paramArray.ToArray()); } catch (Exception ex) {

有关存储过程的几个例子

我的梦境 提交于 2019-12-21 21:07:19
示例 A. 使用带有复杂 SELECT 语句的简单过程 下面的存储过程从四个表的联接中返回所有作者(提供了姓名)、出版的书籍以及出版社。该存储过程不使用任何参数。 USE pubs IF EXISTS (SELECT name FROM sysobjects WHERE name = au_info_all AND type = P) DROP PROCEDURE au_info_all GO CREATE PROCEDURE au_info_all AS SELECT au_lname, au_fname, title, pub_name FROM authors a INNER JOIN titleauthor ta ON a.au_id = ta.au_id INNER JOIN titles t ON t.title_id = ta.title_id INNER JOIN publishers p ON t.pub_id = p.pub_id GO au_info_all 存储过程可以通过以下方法执行: EXECUTE au_info_all -- Or EXEC au_info_all 如果该过程是批处理中的第一条语句,则可使用: au_info_all B. 使用带有参数的简单过程 下面的存储过程从四个表的联接中只返回指定的作者(提供了姓名)、出版的书籍以及出版社

mysql 存储过程编写中踩的坑-----工作项目实战二

ぃ、小莉子 提交于 2019-12-21 01:17:07
如要转载请注明: https://blog.csdn.net/qwert789p/article/details/103627980 创作不易 且行且珍惜 存储过程 while循环 和 游标 第一次 用while写的割接商品数据 CREATE DEFINER=`wlwapp`@`%` PROCEDURE `pro_offer_cutover`() SQL SECURITY INVOKER BEGIN #Author: #Create: 2019-12-17 #存储过程示例 #日志记录定义模块 DECLARE sys_StartTime datetime; DECLARE sys_ErrCode varchar(5) DEFAULT '00000'; DECLARE sys_ErrMessage varchar(200); DECLARE IsSuc tinyint(1); DECLARE v_i int unsigned DEFAULT 1; DECLARE c_offer_id decimal(16,0); DECLARE j_offer_id decimal(16,0); DECLARE j_offer_nbr varchar(30) ; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN GET DIAGNOSTICS

mysql面试题狂刷(四)

丶灬走出姿态 提交于 2019-12-20 18:21:43
1.数据库完整性约束 实体完整性、参照完整性、用户自定义完整性 2.存储过程、触发器、函数的区别 触发器与存储过程非常相似,触发器也是SQL语句集,两者唯一的区别是触发器不能用EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发(激活)执行。触发器是在一个修改了指定表中的数据时执行的存储过程。通常通过创建触发器来强制实现不同表中的逻辑相关数据的引用完整性和一致性。由于用户不能绕过触发器,所以可以用它来强制实施复杂的业务规则,以确保数据的完整性。触发器不同于存储过程,触发器主要是通过事件执行触发而被执行的,而存储过程可以通过存储过程名称名字而直接调用。当对某一表进行诸如UPDATE、INSERT、DELETE这些操作时,SQLSERVER就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合这些SQL语句所定义的规则。 本质上没区别。只是函数有如:只能返回一个变量的限制。而存储过程可以返回多个。而函数是可以嵌入在sql中使用的,可以在select中调用,而存储过程不行。执行的本质都一样。函数限制比较多,比如不能用临时表,只能用表变量.还有一些函数都不可用等等.而存储过程的限制相对就比较少 1)一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。 2)对于存储过程来说可以返回参数,而函数只能返回值或者表对象。 3

Oracle存储过程语法

大城市里の小女人 提交于 2019-12-20 11:29:23
存储过程创建语法: create or replace procedure 存储过程名(param1 in type,param2 out type) as 变量1 类型(值范围); 变量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表示输出 2, 变量带取值范围,后面接分号 3, 在判断语句前最好先用count(*)函数判断是否存在该条操作记录 4, 用select 。。。into。。。给变量赋值 5, 在代码中抛异常用 raise+异常名 以命名的异常 命名的系统异常 产生原因 ACCESS_INTO_NULL 未定义对象 CASE_NOT_FOUND CASE 中若未包含相应的 WHEN ,并且没有设置

存储过程批量删除

三世轮回 提交于 2019-12-20 10:18:38
今天闲来无事,把批量删除由代码删除 改成存储过程删除 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER procedure [dbo].[pr_deletepackage]--------套餐批量删除 ( @ids nvarchar(100) --参数 (1,2,3,) ) as declare @temp table(a varchar(100))--创建临时表 --------把参数@ids分割成int数组 判断是否满足删除条件 declare @n Int declare @lid int--临时ID declare @count int --判断是否使用 declare @sercount int --判断该产品下是否存在服务 set @ids=RTRIM(LTRIM(@ids)) set @n=CHARINDEX(',',@ids) while @n>=1 begin set @lid=Left(@ids,@n-1) --截取当前ID set @count= (select COUNT(*) from t_order_package where pi_id=@lid) --判断当前服务是否已经被使用 set @sercount=(select COUNT(*) from t_package_service

分析

北战南征 提交于 2019-12-20 10:13:42
1、自己也学了一段时间的,mysql数据库,navicat 对自己这段时间的总结 关于mysql的安装问题,之前装的时候,老是会出现问题,一步步地解决,发现第一次装不成功,后面一定要去卸载干净,才能完成第二次的安装,解决的问题方法,每个人遇到的都不一样,学会用百度,这是我学那么久以来,第一次分析,同时,这也是个备忘录。学多了语言,会打架,分不清,我把文章做了专栏,所涉及的不深,完成一个项目,最主要的还是思路 ,只是一开始不要因为语法错误,卡壳太久。 编程最重要的是逻辑。先由点,再由点及面。 我之前的文章,有太多的转载,现在融入了自己的分析,如果有错,希望大家能指出来,共同进步。 之前是学C语言的,它里面实现最后的功能,要有严密的逻辑分析,如果哪一块出错,会导致最后的结果直接出错,我个人的建议是在做这一块时,把项目模块化,一个模块实现一种功能,最后再统一拼接,(如果代码很厉害的话,可以一次全写完),我本人走过这个坑,而且逻辑问题是最难调的。 现在,学了mysql数据库,navicat操作数据库,也可以不用下载navicat,在workbench里也可以完成对表的增,删,改,查,创建存储过程,我个人喜欢用navicat,它里面可以进行 增,删,改,查,创建存储过程,导入小的表,也可导数据库。大表只用workbench. 写那么多,只是为了让大家有这个意识,希望大家能够坚持下去