DataBase 之 存储过程、函数、触发器、事务、游标

(1)存储过程

[1]创建存储过程(无参)

create procedure ProTestA
as
  select * from TestA

--修改存储过程(有参,且为输出参数)
alter procedure ProTestA
@LastName varchar(10) = null output
as
  if @LastName is null
  begin
     print ‘null‘
     print ‘123‘
  end
  else
  begin
  print @LastName
  print ‘456‘
  end
 exec ProTestA
 exec ProTestA ‘Olive‘

(2)自定义函数(关键点:函数和存储过程 区别主要在于函数必须声明返回值类型)

[1]用户自定义函数(返回时间)

create function DayOnly(@date datetime)
returns varchar(12)
as
begin
    return convert(varchar(12),@date,101)
end select dbo.DayOnly(getdate())

[2]用户自定义函数(返回表)

drop function TestATable

create function TestATable(@Name nvarchar(10))

returns table

as

return select * from TestA where [email protected]

select * from TestA

select * from TestATable(‘12‘)

--用户自定义函数输入参数、返回表

create function ResultTable(@Name nvarchar(10))

returns @Result table (Rid varchar(10),Rpwd varchar(10))

as

begin

insert into @Result select * from TestA where [email protected]

return

end

select * from ResultTable(‘12‘)

(3)触发器

[1]创建触发器

create trigger UpdateStudent
on Student for insert
as
begin
  update Student set Sname=‘张三‘ where SID=( select Inserted.SID from Inserted)
end
insert into Student select ‘MM‘,‘1988-11-11‘,‘男‘;
select * from Student order by SID Desc;

[2]禁用触发器

alter table Sales.SalesOrderDetail

DisableTrigger all --这里的all可以是具体的触发器名

[3]删除触发器

Drop Trigger orderDetailNotDiscontinued

[4]修改触发器

Alter Trigger tr_title

on mytable

for insert,update

as

if update(title)

begin

print(‘title1‘)

end

[5]触发器的相关函数Update()

create trigger UpdateTest

on Student

for insert,update

as

if update(SName)----如果update()中的字段有更新的话就为true否则为false

select Inserted.Sname from Inserted

insert into Student select ‘OLIVEVEVE‘,‘1989-12-22‘,‘女‘

[6]触发器(插入新的数据,并且在插入后更新刚插入的输入的姓名)

create trigger InsertTwo

on Student

after insert

as

update Student set Sname=‘OOOO‘ where SID=( select inserted.SID from Inserted)

insert into Student select ‘MoYao‘,‘1989-11-15‘,‘男‘

select * from Student

其中inserted表是一个临时表

存储的是将要插入的信息

这个触发器的目的是检查将要插入的信息是否符合规定

(在product表里没有特殊的记录)

这个例子是check约束所不能解决的了的

use AdventureWorks

go

Create Trigger orderDetailNotDiscontinued

On Sales.SalesOrderDetail

After insert,update

as

if exists

(

select ‘true‘ from Inserted i

join Production.Product p

on i.ProductID= p.ProductID

where p.DiscontinuedDateis not null

)

begin

print(‘error appear.‘)

rollback tran

end

(4)事务

sql事务是使用SQL server自身的事务:在存储过程中直接使用Begin Tran,Rollback Tran,Commit Tran实现事务:

优点:执行效率最佳

限制:事务上下文仅在数据库中调用,难以实现复杂的业务逻辑。

begin try

begin tran

insert into Student(SID) values(-1)

commit tran

print ‘commited‘

end try

begin catch

rollback

print ‘rolled back‘

end catch

TransactionScope事务

TransactionScope事务类,它可以使代码块成为事务性代码。并自动提升为分布式事务

优点:实现简单,同时能够自动提升为分布式事务

那么如何解决数据库并发问题呢?

解决此问题的办法就是为数据库加锁,以防止多个组件读取数据,通过锁住事务所用的数据,能保证开锁之前,只有本事务才能访问数据库。这样就避免了交叉存取的问题

(5)游标

--游标:数据集合里的上下移动的指针

Drop cursor StudentCursor

--声明变量

Declare @SID int

Declare @Sname nvarchar(30)

Declare @Sage nvarchar(30)

Declare @Ssex nvarchar(5)

--声明游标

Declare StudentCursor cursor  for

select * from Student

--打开游标

Open StudentCursor

--将游标移向下一行,将获取的数据放入之前声明的变量中

fetch next from StudentCursor into @SID,@Sname,@Sage,@Ssex

--判断是否获取数据成功,@@fetch_status为系统全局变量,0-表示成功,1-表示取不到数据,2-超出了最后一条数据

while @@fetch_status=0

begin

print(Cast(@SID as varchar)+‘:‘[email protected]+‘:‘[email protected])

--提取下一条记录

fetch next from StudentCursor into  @SID,@Sname,@Sage,@Ssex

end

close StudentCursor

deallocate StudentCursor

--存储过程中使用游标(游标的作用域)

create procedure TestStudentCursor

as

--声明变量填充游标检索到的数据

declare @SID int

declare @Sname nvarchar(30)

declare @Sage nvarchar(30)

declare @Ssex nvarchar(5)

--声明存储过程内部的全局游标

declare StudentCursor  cursor global for

select * from Student

--打开游标

open StudentCursor

--读取下一条数据,并将数据填充到之前声明的变量中

fetch next from StudentCursor into @SID,@Sname,@Sage,@Ssex

--判断是否取到数据,且取到的数据是否符合要求

while(@SID<5) and (@@fetch_status=0)

begin

--打印数据

print(cast(@SID as varchar)+‘::‘[email protected]+‘::‘[email protected])

--读取下一条数据

fetch next from StudentCursor into @SID,@Sname,@Sage,@Ssex

end

--关闭游标

close StudentCursor

--释放游标

deallocate StudentCursor

--执行存储过程

exec TestStudentCursor

时间: 2024-10-07 21:52:14

DataBase 之 存储过程、函数、触发器、事务、游标的相关文章

查看SQL SERVER 加密存储过程,函数,触发器,视图

原文:查看SQL SERVER 加密存储过程,函数,触发器,视图 create  PROCEDURE sp_decrypt(@objectname varchar(50))ASbeginset nocount on--CSDN:j9988 copyright:2004.07.15 --V3.2 --破解字节不受限制,适用于SQLSERVER2000存储过程,函数,视图,触发器--修正上一版"视图触发器"不能正确解密错误--发现有错,请E_MAIL:[email protected]be

T-SQL应用,视图、存储过程、触发器、游标、临时表等

sqlserver常用操作: 视图.存储过程.触发器.函数 --*********************批处理********************* --[在一个批处理中存有一个语法错误,则所有的语句都无法通过编译] USE flowershopdb SELECT * FROM tb_category SELECT * FROM tb_detailed SELECT * FROM tb_product SELECT * FROM tb_shopping SELECT * FROM tb_u

【转】视图、索引、存储过程 、触发器、游标及事务

原文地址:http://www.cnblogs.com/dong897812629/archive/2013/03/27/2981142.html 视图 1.视图不占物理存储空间,它只是一种逻辑对象.可将其看成一个"虚表" 视图是一个由select 语句指定,用以检索数据库表中某些行或列数据的语句存储定义 注:创建视图语句中,不能包括order by.compute或者compute by 子句,也不能出现into关键字 2.创建水平视图 视图的常见用法是限制用户只能够存取表中的某些数

mysql 存储过程 函数 触发器

mysql存储过程与函数 存储过程demo mysql> delimiter // -- 这里//为修改默认分隔符: mysql> CREATE PROCEDURE simpleproc (OUT param1 INT) -> BEGIN -> SELECT COUNT(*) INTO param1 FROM t; -> END// Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; // -- 改回来这里的默

SQL Server 存储过程、触发器、游标

存储过程 1.存储过程是事先编好的.存储在数据库中的程序,这些程序用来完成对数据库的指定操作. 2.系统存储过程: SQL Server本身提供了一些存储过程,用于管理有关数据库和用户的信息. 用户存储过程: 用户也可以编写自己的存储过程,并把它存放在数据库中,供客户端调用. 3.这样安排的主要目的就是要充分发挥数据库服务器的功能,尽量减少网络上的堵塞. 4.系统存储过程 概念: 它的目的在于能够方便地从系统表中查询信息,或者完成与更新数据库表相关的管理任务或其它的系统管理任务. 系统存储过程可

SQL server存储过程,触发器,游标相关实例

1 use MySchool 2 go 3 4 alter proc P_stu 5 @pass int= 60 6 as 7 select AVG(StudentResult)as 平均分 8 from Result 9 10 select * from Result 11 where StudentResult< @pass 12 go 13 14 15 exec P_stu 16 17 go 18 19 ---创建带输出参数的存储过程 20 21 select * from Result

oracle全攻略——存储过程,函数,触发器,程序包,任务,link

数据库MySQL之 视图、触发器、存储过程、函数、事务、数据库锁、数据库备份、事件

浏览目录 视图 触发器 存储过程 函数 事务 数据库锁 数据库备份 事件 一.视图 1.视图概念 视图是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据. 2.视图特点 视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新关系 视图是由基本表(实表)产生的表(虚表) 视图的建立和删除不影响基本表 对视图内容的更新(添加.删除和修改)直接影响基本表 当视图来自多个基本表时,不允许添加,修改和删除数据 3.视图的本质 视图是根据SQL语句获取动态的数据集,并为其命

MySQL-视图-触发器-事务-存储过程-函数-流程控制-索引与慢查询优化-06

目录 视图*** 什么是视图 为什么要用视图 如何生成视图 修改视图 --> 最好(千万)不要 关联表数据改动前 关联表数据改动之后 触发器 什么是触发器 触发条件 触发器语法结构 修改mysql的默认结束符(;) 触发器死循环 六个触发器的执行时机 新增前.新增后.删除前.删除后.更新前.更新后 NEW对象指代的就是当前记录(对象) 事务 ***** 什么是事务 事务的四大特性 ACID A:原子性 atomicity C:一致性 consistency I:隔离性 isolation D:持