Question

Est-il possible de créer une fonction à partir d'un script d'installation Magento ?J'ai actuellement le code suivant :

$installer = $this;
$installer->startSetup();
$installer->run("
         DROP function IF EXISTS {$this->getTable('getLatestActivity')};
         CREATE FUNCTION {$this->getTable('getLatestActivity')} (activityid int) RETURNS int(11)
         BEGIN

         set @rank = 0;

         set @matchingId := (select id from (
         SELECT   @rank := @rank+1 AS rank, t_act.id, t_act.date
         FROM      activityupdates ut_act
         LEFT JOIN activityupdates AS t_act ON t_act.ticked = 1
             AND t_act.date <= ut_act.date AND t_act.customer_id = ut_act.customer_id AND t_act.type = ut_act.type
         WHERE ut_act.id = activityid
         ORDER BY t_act.date DESC
         )ranked
         where ranked.rank = 1);
         return @matchingId;
         END;
     ");

Mais je reçois une exception levée SQLSTATE[42000]: Syntax error or access violation: 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 '' at line 4 - pas très utile.

Pour que cela fonctionne dans PHPMyAdmin, j'ai dû ajouter des lignes concernant les DÉLIMITEURS, mais je pense que c'est un inconvénient de l'interface graphique plutôt que de la FONCTION qui les nécessite.Si je les inclut, j'obtiens simplement une exception concernant la définition d'un DELIMITER à la place.

$installer->run("

         DROP function IF EXISTS `{$this->getTable('getLatestActivity')}`;
         DELIMITER $$
         CREATE FUNCTION `{$this->getTable('getLatestActivity')}` (activityid int) RETURNS int(11)
         BEGIN

         set @rank = 0;

         set @matchingId := (select id from (
         SELECT   @rank := @rank+1 AS rank, t_act.id, t_act.date
         FROM      activityupdates ut_act
         LEFT JOIN activityupdates AS t_act ON t_act.ticked = 1
             AND t_act.date <= ut_act.date AND t_act.customer_id = ut_act.customer_id AND t_act.type = ut_act.type
         WHERE ut_act.id = activityid
         ORDER BY t_act.date DESC
         )ranked
         where ranked.rank = 1);
         return @matchingId;
         END$$

         DELIMITER ;

     ");

Erreur: SQLSTATE[42000]: Syntax error or access violation: 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 'DELIMITER $$ CREATE FUNCTION getLatestActivity (activityid int)

Était-ce utile?

La solution

Mage_Core_Model_Resource_Setup::run() accepte plusieurs requêtes, divisant l'argument donné (instruction SQL) en points-virgules.Cela conduit à diviser le corps de la fonction en plusieurs appels distincts.La déclaration de fonction est alors incomplète et la création de fonction échoue avec le message d'exception donné.

De plus, plutôt que d'utiliser directement le client MySQL CLI (ou PHPMyAdmin), la définition d'un délimiteur conduit à un PDOException. Nils Preuss reçu une solution du Liste de diffusion Zend_Db il y a quelques années:

  1. Ne vous inquiétez pas de DELIMITER, vous n'en avez pas besoin.
  2. Vous devez DROP et CREATE dans deux instructions distinctes.
  3. Contournez la méthode de requête ZF par défaut.

Pour résumer, l'extrait suivant conduira à la création de la fonction :

$this->getConnection()->query("DROP function IF EXISTS `{$this->getTable('getLatestActivity')}`");
$this->getConnection()->query("
CREATE FUNCTION `{$this->getTable('getLatestActivity')}` (activityid int) RETURNS int(11)
BEGIN
    set @rank = 0;
    set @matchingId := (select id from (
        SELECT   @rank := @rank+1 AS rank, t_act.id, t_act.date
        FROM      activityupdates ut_act
        LEFT JOIN activityupdates AS t_act ON t_act.ticked = 1
            AND t_act.date <= ut_act.date
            AND t_act.customer_id = ut_act.customer_id
            AND t_act.type = ut_act.type
        WHERE ut_act.id = activityid
        ORDER BY t_act.date DESC
    ) ranked
    where ranked.rank = 1);
    return @matchingId;
END;
");
Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top