문제

은 그것을 가능하게 함수를 만들 내에서 Magento 설치 스크립트를 사용해야 할까요?나는 현재 다음 코드:

$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;
     ");

하지만 나는 예외가 throw 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 -매우 도움이되지 않습니다.

이에서 실행 PHPMyAdmin,나는 선을 추가하여 구분 기호,하지만 난 그게 단점의 GUI 는 보다는 기능이 필요한다.는 경우에는 그들을 포함,나는 그냥 예외에 대해 정의하고 구분 기호를 대신 합니다.

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

     ");

오류: 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)

도움이 되었습니까?

해결책

Mage_Core_Model_Resource_Setup::run() 지 여러 쿼리,분할 주어진 인자(sql 문을)에서는 세미콜론으로 구분합니다.이 기능을체로 분할되고 여러 별도 호출합니다.함수의 선언은 다음을 불완전하고 기능 만들기 실패와 지정된 예외 메시지입니다.

또한,반대로 사용하여 MySQL CLI 클라이언트(또는 PHPMyAdmin)직접 정의하고 구분 기호를 리드 PDOException. Nils Preuß 을 받았 솔루션 Zend_Db 우편 목록 몇 년 전에:

  1. 걱정하지 않는 구분에,당신은 그것을 필요가 없습니다.
  2. 해야 합니다 드롭고 만들기에 두 가지 별도의 문이 있습니다.
  3. 바이패스 기본 ZF 쿼리 방법입니다.

요약하면 다음과 같은 조각으로 이어질 것 기능을 생성되:

$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;
");
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 magento.stackexchange
scroll top