【问题标题】:SELECT-ing data from stored procedures从存储过程中选择数据
【发布时间】:2010-12-20 21:03:55
【问题描述】:

我有一个复杂的SELECT 查询,它会根据时间范围进行过滤,并且我希望可以使用用户提供的参数来指定这个时间范围(开始日期和结束日期)。所以我可以使用一个存储过程来做这件事,返回的是一个多行的结果集。我遇到的问题是之后如何处理这个结果集。我不能这样做:

SELECT * FROM (CALL stored_procedure(start_time, end_time))

即使存储过程只是一个带参数的SELECT。服务器端准备好的语句也不起作用(它们也不是持久的)。 有人建议使用临时表;这不是一个理想的解决方案的原因是 1)我不想指定表模式,似乎你必须这样做,以及 2)临时表的生命周期将仅限于查询的调用,它不需要再坚持下去了。

所以回顾一下,我想要一个持久的预处理语句服务器端,它的返回是一个结果集,MySQL 可以像处理子查询一样操作它。有任何想法吗?谢谢。

顺便说一句,我使用的是 MySQL 5.0。我知道这是一个相当旧的版本,但这个功能似乎在任何更新的版本中都不存在。我不确定在其他 SQL 引擎中是否可以从存储过程中进行选择;切换目前不是一种选择,但我想知道是否有可能,以防我们将来决定切换。

【问题讨论】:

  • 既然不可能像你想要的那样将存储过程调用为子查询,那么你的情况可以使用视图吗?
  • 视图不起作用的原因是因为我希望子查询接受参数,而视图需要设置整个查询。

标签: mysql stored-procedures prepared-statement temp-tables


【解决方案1】:

在其他引擎中可以从函数中进行选择。例如,Oracle 允许您编写一个返回用户定义类型表的函数。您可以在函数中定义结果集,使用查询甚至使用选择和代码的组合来填充它们。最终,结果集可以从函数中返回,您可以继续使用以下方法查询:

select * from table(FunctionToBeCalls(parameters));

唯一的缺点是这个结果集没有索引,所以如果在复杂查询中使用该函数可能会很慢。

在 MySQL 中,这是不可能的。无法直接在选择查询中使用过程中的结果集。您可以从函数返回单个值,并且可以使用OUTINOUT 参数给您的过程以从中返回值。 但是整个结果集是不可能的。在您的过程中填充一个临时表是最接近的。

【讨论】:

  • 为了完整性:PostgreSQL、SQL Server 和 DB2 中也可以使用“表函数”
  • 好吧,如果要将它们全部列出,那么将 Firebird/Interbase 添加到列表中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 2010-12-02
  • 1970-01-01
相关资源
最近更新 更多