目前,在我的存储过程中,我正在使用光标来处理下面的情况。我所知道的是,我们需要尽可能避免使用游标。
所以,我在这里发布情况给你可以帮助我解决它。
- 在表 A 中,我使用游标逐个获取用户 ID
- 对于每个用户 ID,我调用 2 个函数来处理业务。结果是 2 个字符串。
- 这两个字符串将保存到表 B 中。
- 如果成功,请执行 2 个操作:更新表 A 中的状态 = 1。并返回消息。
- 如果失败,请执行以下操作:返回消息。
- 循环游标
对于步骤 2 - 5 中的业务,如何使用 Cursor 创建存储过程?
我希望你能给我建议来解决这个问题。
谁说你需要避免使用游标?
提供游标是有原因的,在某些情况下,您必须使用游标或求助于获取记录并处理某些编程语言中的逻辑。
如果要在数据库中甚至存储过程中获得每条记录的成功或失败,则需要游标。(是的,触发器后有插入,但这只会使您的逻辑复杂化)
高级别上,您可以做这样的事情(我在表 B 中添加了一个插入日期,因为我认为有必要进行更新)
首先,将数据从表 A 插入表 B 中:
insert into tableB (ID, column1, column2, insertDate)
select ID, callFunction1(userID), callFunction2(userID), getdate()
然后对于插入的记录,设置状态=1
update tableA
set status=1
where ID in (select ID from tableB where insertDate=today)
现在,返回消息类型有点复杂,你不能每行返回一条消息,如果其中任何一个"失败",整个批处理都会失败。
在您的案例中,究竟是什么会导致失败?