Όταν την κάνω call:Κώδικας:DELIMITER $$ CREATE PROCEDURE td_get_random(IN in_tablename VARCHAR(40), IN in_limit INT) BEGIN SET @name = in_tablename; SET @limt = in_limit; PREPARE st1 FROM 'SELECT * FROM ? ORDER BY RAND() LIMIT ?'; EXECUTE st1 USING @name, @limt; DEALLOCATE PREPARE st1; END$$ DELIMITER ;
Παίρνω το εξής σφάλμα:Κώδικας:call td_get_random("tb_users", 10);
Φαίνεται σαν να μην αντικαθιστά τα ? και για αυτό παίρνω syntax error. Το θέμα είναι γιατί; Έψαξα παντού, stack overflow στα docs της mysql και δεν βρίσκω τι κάνω λάθος, μου φαίνεται μια χαρά σωστό.Κώδικας:#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? ORDER BY RAND() LIMIT ?' at line 1
- - - Updated - - -
ΛΥΣΗ
Το πρόβλημα τελικά ήταν ότι τα prepared statements δεν μπορούν να χρησιμοποιήσουν παραμέτροι ? για oνόματα
πινάκων, αλλά μόνο για τιμές σύγκρισης ή παραμέτρων σε aggregation functions.
Έτσι χρησιμοποίησα την CONCAT για να δημιουργήσω το string του prepared statement.
Κώδικας:DELIMITER $$ CREATE PROCEDURE td_random_row(IN in_tablename VARCHAR(40), IN in_limit INT) BEGIN SET @limt = in_limit; SET @s = CONCAT('SELECT * FROM ', in_tablename, ' ORDER BY RAND() LIMIT ?'); PREPARE st1 FROM @s; EXECUTE st1 USING @limt; DEALLOCATE PREPARE st1; END$$ DELIMITER ;
Εμφάνιση 1-1 από 1
-
04-01-20, 18:36 [MySQL]: Prepared Statement μέσα σε Stored Procedure δεν δουλεύει!!! #1
Bookmarks