mySql error 1059 : Contourner l'erreur 1059
Par Jean-Philippe Serafin le dimanche, septembre 14 2008, 19:38 - Lien permanent
Dans le cadre du développement de nano, nous avons créé un générateur dynamique de précédures stockées mySql.
Le test que je cherchais à faire passer nécessite deux classes :
class ClassA extends Database::ModelObject { public static $attributes=array( 'attribute_1'=>array('type'=>'varchar(255)','i18n'=>true), 'attribute_2'=>array('type'=>'varchar(255)', 'default'=>'default text'), ); } class ClassB extends ClassA { public static $attributes=array( 'attribute_3'=>array('type'=>'varchar(255)','i18n'=>true) ); }
Lors d'un appel du finder dynamique,
class TestOfFinder extends UnitTestCase { public function testFind() { $test='condition text'; $test_2='condition text 2'; Database::ModelObject::ClassB_find_by_attribute_1('string to find', array('limit' => array(0,1), 'conditions' => array('string' => 'attribute_2={varchar(255):var_1} and attribute_3={varchar(255):var_2}', 'var_1' => $test, 'var_2' => $test_2, ) )); } }
si la procédure stockée nécessaire à l'abstraction n'existe pas, elle est créée dynamiquement via la commande SQL suivante :
CREATE procedure ClassB_find_by_attribute_1_attribute_2_equal_var_1_and_attribute_3_equal_var_2_limit(attribute_1 varchar(255),var_1 varchar(255),var_2 varchar(255)) SELECT ClassB.id,ClassB_i18n.attribute_3,ClassA_i18n.attribute_1,ClassA.attribute_2 FROM ClassB JOIN ClassB_i18n ON ClassB.id =ClassB_i18n.ClassB_id JOIN ClassA ON ClassB.parent_id=ClassA.id JOIN ClassA_i18n ON ClassA.id=ClassA_i18n.ClassA_id WHERE culture=culture AND attribute_1=attribute_1 AND attribute_2=var_1 AND attribute_3=var_2;
Seulement, l'identifiant unique de la procédure : "ClassB_find_by_attribute_1_attribute_2_equal_var_1_and_attribute_3_equal_var_2_limit" déclanchait une erreur 1059.
Pour contourner ce problème, il faut executer la requête suivante :
ALTER TABLE `mysql`.`proc` CHANGE `name` `name` CHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ALTER TABLE `mysql`.`proc` CHANGE `specific_name` `specific_name` CHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
et ainsi passer de type varchar(64) à varchar(255) pour le champ correspondant au nom de requête. Petite contrainte : nécessite un accés root sur mysql.