11

ページング クラスを作成していて、2 つのパラメーターを LIMIT 句の MySQL ストアド プロシージャに渡す必要があります。

私はそれらをINTとして渡し、このようなことを試みています

SELECT *
FROM
`MyTable`
LIMIT
MyFirstParamInt, MySecondParamInt

ただし、sprocを保存しようとするとエラーが発生します。私が行方不明になっているこれを行う方法はありますか?それとも、クエリ全体を EVAL して EXECUTE する必要がありますか?

4

8 に答える 8

17

役に立つかもしれない解決策を見つけました。ストアドプロシージャで宣言された変数を使用し、それらをパラメータに設定します

例えば。

 CREATE PROCEDURE MyProcedure(
   IN paramFrom INT,
   IN paramTo INT
  )
   BEGIN
       DECLARE valFrom INT;
       DECLARE valTo   INT;

       SET valFrom = paramFrom;
       SET valTo = paramTo;

       SELECT * FROM myTable LIMIT valFrom, valTo;
    END
于 2013-01-24T16:38:17.713 に答える
17

5.5.6 より前でLIMITは、MySQL ストアド プロシージャでパラメータ化できませんでした。クエリを動的に作成して実行する必要があります。

5.5.6 以降では、格納されている procs パラメータを に引数として渡すことがLIMITできOFFSETますINTEGER

于 2010-05-20T15:39:57.337 に答える
10

http://dev.mysql.com/doc/refman/5.1/en/select.htmlから:

LIMIT 句を使用して、SELECT ステートメントによって返される行数を制限できます。LIMIT は 1 つまたは 2 つの数値引数を取り、両方とも非負の整数定数でなければなりません(準備済みステートメントを使用する場合を除く)。

役立つ可能性のある準備済みステートメントの例を次に示します。

SET @skip=1;
SET @rows=5;

PREPARE STMT FROM 'SELECT * FROM table LIMIT ?, ?';
EXECUTE STMT USING @skip, @rows;
于 2010-05-20T15:41:42.243 に答える
1

以下は、MySQL 5.5.35 で問題なく動作しました。また、ステートメントSELECT内で同じものが使用された別の手順でも機能しました。DECLARE . . . CURSOR

CREATE PROCEDURE `test`(
  IN `lim_val` INT,
  IN `lim_offset` INT
)
BEGIN
  SELECT array_ident_id
    FROM ArrayIdents
    ORDER BY array_ident_id
    LIMIT lim_val OFFSET lim_offset;
END;
于 2014-05-19T17:08:45.747 に答える
0

ステートメントなしのページネーション:

create PROCEDURE test(
  IN first_rec integer,
  IN rec_count integer
)
BEGIN
  -- return --
  SET @rownum=0;
  SELECT * FROM (
    SELECT
    user.*, @rownum:=@rownum+1 AS rn FROM user
  ) t WHERE rn>=first_rec and rn<first_rec+rec_count;
END;;
于 2014-02-17T09:22:42.577 に答える
0
DELIMITER &&  
CREATE PROCEDURE SP_ALL( pageno int, pagesize int)    
BEGIN    
declare pg int;
declare ps int;
set pg = ((pageno - 1) * PageSize);
set ps = (pageno * pagesize);
    SELECT * FROM Users where IsActive = true limit ps offset pg;     
END &&  
DELIMITER ; 
于 2021-12-22T06:39:08.080 に答える