web-dev-qa-db-fra.com

Obtenir une erreur: [Err] 1615 - L'instruction préparée doit être re-préparée avec MySQL 5.6.30

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
7
Abdul Manaf

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

ALTERNATIVES

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.

6
RolandoMySQLDBA