MySQL 기능에 설치 스크립트
-
13-12-2019 - |
문제
은 그것을 가능하게 함수를 만들 내에서 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 우편 목록 몇 년 전에:
- 걱정하지 않는 구분에,당신은 그것을 필요가 없습니다.
- 해야 합니다 드롭고 만들기에 두 가지 별도의 문이 있습니다.
- 바이패스 기본 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;
");