Problème/Problème: Erreur lors de l'obtention: [Err] 1615 - Prepared statement needs to be re-prepared
J'ai une procédure stockée qui contient une déclaration préparée et une vue
DROP PROCEDURE IF EXISTS `sampleProc`;
DELIMITER ;;
CREATE DEFINER = `root`@`localhost` PROCEDURE `sampleProc`()
BEGIN
SET @select = "SELECT * FROM `viewSample` ";
PREPARE stmt FROM @select ;
EXECUTE stmt ;
DEALLOCATE PREPARE stmt ;
END ;;
DELIMITER ;
L'appel suivant donne parfois une erreur CALL sampleProc();
Contournement possible/solutions
Il semble que la meilleure solution consiste à augmenter la valeur de table_definition_cache, mais il semble que cela ne fonctionne pas, car il avait déjà été augmenté de 1400 (par défaut) à 16384. table_open_cache a également été augmenté à 32162
Variable_name Value
table_definition_cache 16384
table_open_cache 32162
table_open_cache_instances 4
Cela semble être un problème permanent
Les vues sont difficiles à gérer avec Dynamic SQL
Le premier bug était Impossible de créer des VUES dans les instructions préparées d'il y a 11 ans. Un correctif a été installé pour y remédier .
Un autre rapport de bogue, Prepared-Statement échoue lorsque MySQL-Server sous charge , indique que l'erreur 1615 n'est pas un bogue lorsque les tables sous-jacentes sont occupées. (Vraiment ?)
Bien qu'il y ait un certain mérite à augmenter la taille du cache de table (Voir Erreur MySql lorsque vous travaillez avec une vue mysql ), cela ne fonctionne pas toujours (Voir Erreur générale: 1615 L'instruction préparée doit être re-préparé (sélection de la vue mysql) )
Il y a plus d'un an, quelqu'un l'a mentionné dans le MySQL Forum (MySql "view", "prepare statement" and "Prepared statement needs to be re-prepare") .
Quelqu'un est venu avec l'idée simple de ne pas utiliser la vue dans l'instruction préparée mais d'utiliser le SQL de la vue dans une sous-requête à la place . Une autre idée serait de créer le SQL utilisé par la vue et l'exécuter dans votre code client .
Cela semble être de meilleures solutions de contournement qui augmentent simplement la taille du cache de table.