2010-05-20 21 views
10

Bir çağrı sınıfı oluşturuyorum ve LIMIT yan tümcesi için MySQL saklı yordamına iki parametreyi iletmem gerekiyor.MySQL sproc parametresi olarak LIMIT'i geçiyor

ben denemek ve olsa sproc kaydederken bana bir hata veriyor bu

SELECT * 
FROM 
`MyTable` 
LIMIT 
MyFirstParamInt, MySecondParamInt 

gibi bir şey IntS olarak geçirerek ve çalışıyorum. Bunu sadece eksik olduğum bir yolu var mı? Ya da tüm sorguyu DEĞERLENDİRMELİ ve ÇALIŞTIRMALIM?

cevap

13

5.5.6'dan önce, LIMIT, MySQL saklı yordamlarında parametrelenemedi. Sorguyu dinamik olarak oluşturup yürütmeniz gerekir.

5.5.6 ve üstü sürümlerde, kaydedilen procs parametrelerini LIMIT ve OFFSET için INTEGER oldukları sürece argüman olarak geçirebilirsiniz. http://dev.mysql.com/doc/refman/5.1/en/select.html itibaren

+0

bundan korktuğum şey ... teşekkürler. – Kyle

+1

o rly? \t 9 tane daha gitme zamanı .. –

+0

Bu doğru cevap doğru değil, doğru olanı @Eric_M adlı kullanıcı yanıtlandı – Bergkamp

8

:

LIMIT deyimi SELECT ifadesinin döndürdüğü satır sayısını sınırlamak için kullanılabilir. LIMIT, numaralı negatif olmayan tamsayı sabitleri olması gereken bir veya iki sayısal bağımsız değişken, alır (hazırlanmış ifadeler kullanıldığında hariç).

İşte size yardımcı olabilir hazırlanmış deyimi örnek:

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

PREPARE STMT FROM 'SELECT * FROM table LIMIT ?, ?'; 
EXECUTE STMT USING @skip, @rows; 
+0

[MySQL'de saklı yordam parametresiyle seçilen satırların sayısını sınırlama] (http://stackoverflow.com/questions/245180/variable-limit-clause-in-mysql) –

7

Sadece yararlı olabilecek bir çözüm buldu. Kayıtlı yordamınızda bildirilen değişkenleri kullanın ve bunları

gibi parametrelere ayarlayın. ifadeleri olmadan

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 
+1

Bu benim için 5.1.71 kullanmadı. Her ne kadar 5.5.33a-MariaDB'de Saklı Prosedürler kullanılarak parametreler geçmekte sorun yaşamadım. –

-1

sayfalandırma:

create PROCEDURE test(
    IN first_rec integer, 
    IN rec_count integer 
) 
BEGIN 
    -- return -- 
    SET @rownum=0; 
    SELECT * FROM (
    SELECT 
    user.*, @rownum:[email protected]+1 AS rn FROM user 
) t WHERE rn>=first_rec and rn<first_rec+rec_count; 
END;; 
0

şu MySQL 5.5.35, yalnızca iyi çalıştı. Aynı SELECT'un bir DECLARE . . . CURSOR deyiminde kullanıldığı başka bir yordamda da çalıştı.

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; 
-1

Basit çözüm

CREATE PROCEDURE `some_proc` (
IN _START INTEGER, 
IN _LIMIT INTEGER 
) 
BEGIN 
PREPARE STMT FROM 
" SELECT * FROM products LIMIT ?,? "; 
SET @START = _START; 
SET @LIMIT = _LIMIT; 
EXECUTE STMT USING @START, @LIMIT; 
DEALLOCATE PREPARE STMT; 
END $$ 

saklı yordam deyimini hazırlamak deneyin.