在循环中执行存储过程以获取记录集

Posted

技术标签:

【中文标题】在循环中执行存储过程以获取记录集【英文标题】:Execute stored procedure in a loop for set of records 【发布时间】:2020-05-13 12:22:41 【问题描述】:

我想编写一个存储过程来循环遍历一组记录,并为每个记录执行另一个存储过程。

选择查询返回的id列表:

select id 
from abc 
where some condition

我有一个存储过程usp_get_data @id=id,我想为选择查询的每一行执行它。我不想使用光标。我还有哪些其他方法可以实现这一目标?

foreach(item in select statement)

    execute stored procedure

子存储过程将返回一个记录列表,然后我将从主存储过程返回

【问题讨论】:

这能回答你的问题吗? SQL Call Stored Procedure for each Row without using a cursor 程序代码是高度特定于供应商的 - 所以请添加一个标签来指定您是否使用mysqlpostgresqlsql-serveroracledb2 - 或完全不同的东西。 您知道循环与游标并没有太大区别吗?你有什么理由不使用光标? @Arti 你的意思是你需要它异步运行? @Arti 每次迭代都从表中读取的循环也是如此 【参考方案1】:

我不想使用光标。我还有哪些其他方法可以实现这一目标?

重写存储过程以对一组数据进行操作。您可以使用table-valued parameter 将批量数据传递给存储过程,或者将数据加载到存储过程随后使用的临时表中。

或者使用光标。它们并不是最糟糕的事情,“为每一行调用一个存储过程”可能是游标最常见的合法用途。此外,没有光标的循环解决方案都是愚蠢的,比使用光标更糟糕。

【讨论】:

另一种选择,取决于存储过程的作用,是将它写成一个表值函数,可以是CROSS APPLY'd。这并不总是可能的,但经常被忽视。 如果游标像某些人认为的那样糟糕,它们就不会被实现! 游标也很旧。它们与 25 年前基本相同,当时服务器运行单核 100MHz 处理器。那时“太慢”的东西几乎不再重要了。

以上是关于在循环中执行存储过程以获取记录集的主要内容,如果未能解决你的问题,请参考以下文章

oracle 如何返回多条记录

Entity Framework 6 中具有多个记录集的存储过程

如何从内部调用获取记录集到存储过程?

oracle 存储过程执行动态SQL 返回结果给游标,外部程序获得dataset结果集。

如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集?

如何php调用oracle存储过程返回的是一个结果集,该怎么从php页面中吧数据循环输出呀