【问题标题】:Limiting selected rows count with a stored procedure parameter in MySQL在 MySQL 中使用存储过程参数限制选定的行数
【发布时间】:2011-01-25 00:42:54
【问题描述】:

我有一个包含 SELECT 语句的过程 SelectProc。我想添加一个过程参数 LimitRowsCount 并按如下方式使用它:

CREATE PROCEDURE SelectProc (IN LimitRowsCount INTEGER UNSIGNED) 
BEGIN
   SELECT (...)
   LIMIT LimitRowsCount;
END

但是这种方法行不通。

SELECT 本身包含嵌套的子查询,因此我无法从中创建视图。有没有比动态 SQL(预处理语句)更合适的方法?

【问题讨论】:

    标签: mysql select limit procedure


    【解决方案1】:
    CREATE PROCEDURE SelectProc (IN LimitRowsCount INT) 
    BEGIN
    
    SET @LimitRowsCount1=LimitRowsCount; 
    
    PREPARE STMT FROM "SELECT (...) LIMIT ?";
    
    EXECUTE STMT USING @LimitRowsCount1; 
    
    END
    

    【讨论】:

      【解决方案2】:

      来自手册:

      The LIMIT clause can be used to constrain the number of rows 
      returned by the SELECT statement. LIMIT takes one or two numeric 
      arguments, which must both be nonnegative integer constants  
      (except when using prepared statements). 
      

      MySQL Manual - 12.2.8. SELECT Syntax

      所以这是一个不 - 你不能。

      【讨论】:

      • 不代表没有更好的办法?没有什么比 LIMIT 更有效?
      • 没有什么比使用准备好的语句更容易的了。您可以将您的数据选择到一个临时表中,将其调整为大小,然后选择它——但这比将限制子句嵌入到准备好的语句中要麻烦得多。有什么特别的原因你不想使用准备好的语句吗?
      • 不知何故,我只是不喜欢使用类似 eval 的函数。在这种情况下,我将不得不这样做。感谢您的帮助!
      • 您必须小心 SQL 注入 - 但如果您的 eval / prepare 是在存储过程中执行的,那么只要您的 limit 参数只是一个数字,您就应该是安全的。为了安全起见,您应该测试存储过程中的值。
      猜你喜欢
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多