passare LIMIT come parametri a MySQL sproc

Sto creando una class di paging e ho bisogno di passare due parametri alla mia stored procedure MySQL per la clausola LIMIT.

Li sto passando come INT e sto provando qualcosa del genere

SELECT * FROM `MyTable` LIMIT MyFirstParamInt, MySecondParamInt 

mi dà un errore quando provo a salvare lo sproc però. C’è un modo per farlo che mi manca? O ho intenzione di EVAL l’intera query e l’ESEGUI?

Prima del 5.5.6, LIMIT non poteva essere parametrizzato nelle procedure memorizzate MySQL. Dovresti creare la query in modo dinamico ed eseguirla.

In 5.5.6 e versioni successive, è sufficiente passare i parametri procs memorizzati come argomenti a LIMIT e OFFSET a condizione che siano INTEGER .

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

La clausola LIMIT può essere utilizzata per limitare il numero di righe restituite dall’istruzione SELECT. LIMIT accetta uno o due argomenti numerici, che devono essere entrambi costanti integer non negativi (tranne quando si usano istruzioni preparate).

Ecco un esempio di istruzione preparato che potrebbe aiutarti:

 SET @skip=1; SET @rows=5; PREPARE STMT FROM 'SELECT * FROM table LIMIT ?, ?'; EXECUTE STMT USING @skip, @rows; 

Ho appena trovato una soluzione che potrebbe essere utile. Usa le variabili dichiarate nella procedura memorizzata e impostale sui parametri

per esempio.

  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 

Quanto segue ha funzionato bene in MySQL 5.5.35. Ha funzionato anche in un’altra procedura in cui è stato utilizzato lo stesso SELECT all’interno di un DECLARE . . . CURSOR DECLARE . . . CURSOR Dichiarazione 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; 

Il miglior esempio di impaginazione può aiutarti

chiama user_list (v_private_key, v_user_id, v_pageIndex, v_limit, v_image_path, @o_rec_count, @o_error_code, @o_error_message)

 DECLARE v_QueryLimit TEXT DEFAULT ""; DECLARE v_Select TEXT DEFAULT ""; DECLARE v_where TEXT DEFAULT ''; DECLARE v_From TEXT DEFAULT ""; DECLARE v_group_by TEXT DEFAULT " "; DECLARE v_having TEXT DEFAULT ""; DECLARE v_OrderBy TEXT DEFAULT ""; SET o_error_code = '200'; SET v_Select = CONCAT(" SELECT AES_DECRYPT(email,'",v_private_key,"') AS email, AES_DECRYPT(first_name,'",v_private_key,"') AS first_name, AES_DECRYPT(last_name,'",v_private_key,"') AS last_name, AES_DECRYPT(mobile_no,'",v_private_key,"') AS mobile_no, CONCAT(AES_DECRYPT(first_name,'",v_private_key,"'),' ', AES_DECRYPT(last_name,'",v_private_key,"')) as full_name, CONCAT('",v_image_path,"','profile/',IFNULL(thumb,'user_thumb.png')) AS thumb, CONCAT('",v_image_path,"','profile/small/',IFNULL(thumb,'user_thumb.png')) AS thumb_small, IFNULL(country_code,'+91') as country_code, IFNULL(unique_code,'') as user_code "); SET v_From = CONCAT(" FROM userinfo WHERE role_group = 2 AND id != ",v_user_id," "); IF (v_PageIndex) > 0 THEN SET v_QueryLimit = CONCAT(" LIMIT ", v_limit, "," , v_pageIndex); END IF; -- set v_group_by = concat(' GROUP BY ut.user_card_id, '); SET @rec_Query= CONCAT(v_Select ,v_From ,v_Where ,v_group_by ,v_having ,v_OrderBy); /**************** Get Record Count **************/ SET @cnt_Query = CONCAT("Select Count(*) INTO @o_rec_count FROM (",@rec_Query,") AS tmp"); PREPARE c2 FROM @cnt_Query; EXECUTE c2; SET [email protected]_rec_count; /**************** Calculate Limit **************/ IF (v_limit != "" && v_pageIndex != "") AND @o_rec_count>0 THEN CALL Calculate_Paging_Index(@o_rec_count ,v_limit,v_pageIndex,@new_start_limit); SET v_QueryLimit = CONCAT(" LIMIT ",@new_start_limit, ",",v_limit); END IF; SET @vv2_Query= CONCAT(v_Select ,v_From ,v_Where ,v_group_by ,v_having ,v_OrderBy ,v_QueryLimit); PREPARE s2 FROM @vv2_Query; EXECUTE s2; SET o_error_message = "success"; 

calcolare l’indice della pagina SP

CREATE PROCEDURE calculate_paging_index (in_count,in_limit,in_page,@out_start_limit) inserisci qui il codice`

 DECLARE count1 INT; DECLARE total_pages INT; SET count1 = in_count; IF( count1 > 0 ) THEN SET total_pages = CEIL(count1/in_limit); ELSE SET total_pages = 0; END IF; IF (in_page > total_pages) THEN SET in_page=total_pages; END IF; SET out_start_limit = in_limit * in_page - in_limit; 

impaginazione senza dichiarazioni:

 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 

Soluzione semplice

 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 $$ 

Prova a preparare la dichiarazione nella stored procedure.