Κώδικας:
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:
Κώδικας:
call td_get_random("tb_users", 10);
Παίρνω το εξής σφάλμα:
Κώδικας:
#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
Φαίνεται σαν να μην αντικαθιστά τα ? και για αυτό παίρνω syntax error. Το θέμα είναι γιατί; Έψαξα παντού, stack overflow στα docs της mysql και δεν βρίσκω τι κάνω λάθος, μου φαίνεται μια χαρά σωστό.

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