SQL--存储过程+触发器 对比!
一、存储过程
一:存储过程:存储过程是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中。
可以用存储过程名字和参数来调用存储过程,这样可以避免代码重复出现,用起来也方便。
例: 下面是定义了一个名为Buyfruit的存储过程,参数为购买人的姓名,水果名称,购买数量三个,此存储过程的作用是,输入了这三个参数之后,判断账户余额和库存是否足够,足够的话将账户余额减掉花费,将库存减掉购买的数量显示出来,打印一个订单,和一个明细。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
create PROCEDURE BuyFruit @username varchar(20), @fruitname varchar(20), @buycount int = 0 AS BEGIN declare @kc int,@price float,@fruitid varchar(20) --先把该水果的库存量找出来 select @fruitid=ids, @kc = numbers,@price=price from fruit where name=@fruitname --根据购买数量和库存的关系,进行购买 if @buycount < @kc begin declare @money decimal(18,2) select @money = account from login where username=@username --根据用户名找到账户余额 if(@money > @price*@buycount) begin update login set account=account-@price*@buycount where username=@username update fruit set numbers = numbers-@buycount where name=@fruitname declare @ordercode varchar(50) set @ordercode ='O'+cast(getdate() as varchar(50)) insert into orders values(@ordercode,@username,GETDATE()) insert into orderdetails values(@ordercode,@fruitid,@buycount) end else begin print '余额不足' end end else begin print '库存不足' end END |
购买之前数据库中的内容:
购买成功之后数据库中存储的内容:
添加到订单的和购买明细:
二:触发器
触发器是一种特殊的存储过程
触发器主要是通过事件进行触发而被自动执行的,而存储过程可以通过存储过程名字而被直接调用
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性,另外还有强化约束和级联运行的功能。
关于inserted和deleted临时表
这两个表是由系统管理的,存储在内存中,不是存储在数据库中,因此不允许用户直接对其修改,是只读的,系统在执行插入操作的时候先将数据插入到inserted临时表中,然后再向数据库的表中插入,在插入下一条时这条被删除;执行删除操作的时候,先将数据传到deleted表里,再删除数据,起到一个保存临时数据用来恢复或者记录的作用。
下面这个是做了一个删除时触发的触发器,在删除student表中数据时,将删除的这一行插入到biandong表里面
--用于删除触发的触发器:
create trigger TR_STUDENT_DELETE
on student
for delete --for触发器after触发器,删除后触发
as
declare @no varchar(3),@name varchar(4)
select @no=sno,@name=sname from deleted --用到了临时表
insert into biandong values(@no,@name,'100')
go
--下面执行删除的时候触发上面的程序,
delete from student where sname='猴子'
还有一种是instead of触发,触发的时候用触发器里面的程序代替执行操作,即执行触发器里面的东西
下面例子,原来三个表,由info表里的code约束另外两个表,因此没法单独删除info中的某一行,利用触发器可以删除三个表中code为p001的行
create trigger TR_INFO_DELETE
on info
instead of delete --instead of 触发器,删除的时候替代执行触发器
as
declare @code varchar(20)
select @code=code from deleted
delete from family where infocode=@code
delete from work where infocode=@code
delete from info where code=@code
go
instead of 触发器创建完成下面开始触发:
delete from INFO where name ='胡军'
此时删除了三个表中p001的行
D、删除触发器:
drop trigger TR_INFO_DELETE
SQL--存储过程+触发器 对比!的更多相关文章
- SQL 存储过程 触发器 事务
一.存储过程 存储过程:就像函数一样的会保存在:数据库中-->可编程性 --> 存储过程 创建存储过程:create proc JiaFa --存储关键字proc @a int, ...
- SQL Server T—SQL 存储过程 触发器
一.存储过程 存储过程是一组编译在单个执行计划中的T-SQL语句 存储过程:就像函数一样的会保存在数据库中(可编程性) 存储过程的优点: 1.允许模块化程序设计 2.允许更快执行如果某操作需要大量T- ...
- SQL存储过程概念剖析
一.SQL存储过程的概念,优点及语法 定义:将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execut ...
- mysql与sql server参照对比学习mysql
mysql与sql server参照对比学习mysql 关键词:mysql语法.mysql基础 转自桦仔系列:http://www.cnblogs.com/lyhabc/p/3691555.html ...
- PL/SQL存储过程编程
PL/SQL存储过程编程 /**author huangchaobiao *Email:huangchaobiao111@163.com */ PL/SQL存储过程编程(上) 1. Oracle应用编 ...
- SQL 存储过程入门(事务)(四)
SQL 存储过程入门(事务)(四) 本篇我们来讲一下事务处理技术. 为什么要使用事务呢,事务有什么用呢,举个例子. 假设我们现在有个业务,当做成功某件事情的时候要向2张表中插入数据,A表,B表,我 ...
- 15、SQL Server 触发器
SQL Server 触发器 触发器是一种特殊的存储过程,只有当试图用数据操作语言DML来修改数据时才会触发,DML包含对视图和表的增.删.改. 触发器分为DML触发器和DDL触发器,其中DML触发器 ...
- (转)SQL Server 触发器
SQL Server 触发器 触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 ...
- SQL存储过程和函数
SQL存储过程: 由来:在具体应用中,一个完整的操作会包含多条SQL语句,在执行过程中需要根据前面SQL语句的执行结果有选择的执行后面的SQL语句.因此,mysql提供了数据库对象存储过程和函数. 定 ...
随机推荐
- SQL Server 基础 04 函数与分组查询数据
函数与分组查询数据 系统函数分 聚合函数.数据类型转换函数.日期函数.数学函数 . . . 1. 聚合函数 主要是对一组值进行计算,然后返回一个值. 聚合函数包括 sum(求和).avg(求平均值). ...
- leetcode 编辑距离
class Solution { public: int minDistance(string word1, string word2) { // Start typing your C/C++ so ...
- TCP连接状态具体解释
tcp状态: LISTEN:侦听来自远方的TCPport的连接请求 SYN-SENT:再发送连接请求后等待匹配的连接请求 SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认 ...
- PHP - 图像处理
第14章 处理图像 学习要点: 1.创建图像 2.简单小案例 在PHP5中,动态图象的处理要比以前容易得多.PHP5在php.ini文件中包含了GD扩展包,只需去掉GD扩展包的相应注释就可以正常使用了 ...
- Debian安装Nexus
前置条件 安装jdk (如果使用 nexus-2.6 以上版本需要jdk7) 1 apt-get install openjdk-6-jre / apt-get install openjdk-6-j ...
- 基于visual Studio2013解决C语言竞赛题之1040因数分解
题目 解决代码及点评 /* 将一个数M分解为质因数(M≠0). */ #include <stdio.h> #include <stdlib.h> void main() ...
- Mina airQQ聊天 服务端篇(二)
Mina聊天服务端实现思路:在用户登录的时候.连接服务端而且验证登录用户,假设成功,则将IoSession保存到map<账号,IoSession>中,而且通知该用户的好友上线,然 后再请求 ...
- ubuntu 14.04 使用极点五笔输入法
相比12.04在外观改变不是非常大,但当中细节有些许变化,特别输入法非常不大好用,为此,我们使用fcitx输入法,使用我喜欢的五笔拼音,安装步骤例如以下: 方法一: 最新的方法非常easy: 安装14 ...
- Google 开源项目风格指南阅读笔记(C++版)
虽说是编程风格指南,可是干货也不少,非常多C++的有用技术在里面. 头文件 通常每一个.cpp文件都相应一个.h文件:#define保护全部头文件都应该使用#define防止头文件被多重包括,为保证唯 ...
- C++ 需要返回值的函数却没有返回值的情况 单例模式
昨天在看前些天写的代码,发现一个错误. #include <iostream> using namespace std; class singleton { public: static ...