不明白 为什么 '存储过程' 要有 RETRUN ,这不是 破坏 "数据完整性" 吗?

nettian2006 2009-04-15 08:38:27
存储过程明明是为"数据完整性"服务的,为什么要有REturn呢?return可以从查询或过程中无条件退出.可是当return退出后,在return之前的语句执行了并没有回滚回来,这不就不保证,"存储过程"作为一个操作单元执行了吗?要么成功全部执行SQL语名;要么失败,所有语句都不执行.???为什么要有return呢?
...全文
150 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
时光瞄 2009-04-16
  • 打赏
  • 举报
回复
纯顶...
yuliangok520 2009-04-16
  • 打赏
  • 举报
回复
存储过程就是SQL的一种编程,你觉得程序里会没用return嘛?return是控制程序的。数据完整性是事务的一种特性,要么提交,要么回滚。
yibey84 2009-04-16
  • 打赏
  • 举报
回复
顶了,学习了大家继续讨论
riveryeah 2009-04-16
  • 打赏
  • 举报
回复
存储过程不加事务的话还用return么
  • 打赏
  • 举报
回复
楼主可以这样来看下这两者的区别:
create proc p1 --没有使用事务
as

insert into table1 (id) values (1)
insert into table1 (id) values ('abc')
insert into table1 (id) values (3)

--
create proc p2 --使用了事务
as
begin tran
insert into table1 (id) values (1)
insert into table1 (id) values ('abc')
insert into table1 (id) values (3)
commit tran

两者的区别是第一个存储过程的第一个insert语句是可以被执行的,也就是说能够向数据库插入一条数据,而第二个是不能插入的。
所以第一个存储过程并不是楼主所理解的原子操作。而是因为当执行insert into table1 (id) values ('abc')的时候出错,那么整个存储过程就跳出了,终止了存储过程的执行。但是第一条已经执行了,是不撤销的。
原子操作是里面的操作要么全部执行,要么一个都不执行,所以存储过程如果不声明为事务的话,不是一个原子操作。
tszhen331 2009-04-16
  • 打赏
  • 举报
回复
学习,探讨了
cxmcxm 2009-04-16
  • 打赏
  • 举报
回复
基本上,基于过程的语言都有return的功能
其实return相应于goto到结束

goto l1

......
语句...
语句....




l1: --结束
cxmcxm 2009-04-15
  • 打赏
  • 举报
回复
假如在一个存储过程中有
insert into table1 (id) values (1) --这是对的(A)
insert into table1 (id) values ('abc')---这是错的(B)
insert into table1 (id) values (3) --这个就不会再执行了,对不,而(A)是被执行了,并且没有被回滚是不?

我没说错哦?这不是原子操作吗?
----------------
如果存储过程执行出错时,
公用变量@@errorno会<>0
如果是启动了事务
可用以下语句回滚
exec 存储过程
if @@error<>0 --执行失败时回滚
rollback tran

nettian2006 2009-04-15
  • 打赏
  • 举报
回复
针对我在6楼说的,如果有错请高手指出哦
nettian2006 2009-04-15
  • 打赏
  • 举报
回复
假如在一个存储过程中有
insert into table1 (id) values (1) --这是对的(A)
insert into table1 (id) values ('abc')---这是错的(B)
insert into table1 (id) values (3) --这个就不会再执行了,对不,而(A)是被执行了,并且没有被回滚是不?

我没说错哦?这不是原子操作吗?

  • 打赏
  • 举报
回复
觉得楼主对存储过程的定义和作用没有理解清楚
taoistong 2009-04-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 nettian2006 的回复:]


两位楼上的朋友,我没有说事务,我是说在"存储过程"中的return,它不是破坏存储过程了完整性了吗
[/Quote]

你从哪本书看书看的,说存储过程是原子性的。ACID
只要不声明begin tran

就单独执行各自的。
比如存储过程里面有两个更新语句。
有可能一句执行,一句失败。
nettian2006 2009-04-15
  • 打赏
  • 举报
回复


两位楼上的朋友,我没有说事务,我是说在"存储过程"中的return,它不是破坏存储过程了完整性了吗
sdhdy 2009-04-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 nettian2006 的帖子:]
存储过程明明是为"数据完整性"服务的,为什么要有REturn呢?return可以从查询或过程中无条件退出.可是当return退出后,在return之前的语句执行了并没有回滚回来,这不就不保证,"存储过程"作为一个操作单元执行了吗?要么成功全部执行SQL语名;要么失败,所有语句都不执行.???为什么要有return呢?
[/Quote]
建议楼主不要仅仅从字面上去理解,return不是乱用的,得符合业务逻辑才行。
象你说的:要么成功全部执行SQL语名;要么失败,所有语句都不执行,这肯定要用到事务,如果成功了,那肯定是
commit tran 然后returun ;如果失败的话,肯定要rollback tran,然后return.
htl258_Tony 2009-04-15
  • 打赏
  • 举报
回复
不一定所有存储过程都要用return,如果你想让所有语句中某条不成功其余全部回滚,应该使用事务控制.

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧