我在Magento中有一个工作模块,它模仿我们在安装之外使用的一些自定义代码。此模块当前将5个表添加到数据库以存储信息,我已将Admin扩展为CRUD信息。这里的最终目标是将大部分自定义编程转移到Magento中。
目前,我们的自定义代码位于Magento之外,并且可以访问单独的数据库。该数据库具有相同的5个表,存储过程和4个函数。我现在要做的是将存储过程和函数移动到Magento的数据库中,并更改自定义代码以从Magento的db调用它的所有数据。但是,我似乎无法弄清楚应如何为Magento正确设置“CREATE FUNCTION”调用。
我正在使用的SQL是:
DROP FUNCTION IF EXISTS {$this->getTable('fn_Get_HardinessZone')};
CREATE FUNCTION {$this->getTable('fn_Get_HardinessZone')}(IN ZipCode varchar()) RETURNS integer AS
DECLARE Result integer;
BEGIN
SELECT MAX(Zone) into Result
FROM AMI_zones
WHERE (Hfzip <= LEFT(ZipCode, 5)) AND (Htzip >= LEFT(ZipCode, 5));
if Result is null or Result < 1 or (Result > 11 and Result <> 99) Then
/*if the left most character is alpha, then set the zone to 98 for Canada*/
if Left(zipCode, 1) >= 'A' and LEFT(zipcode,1) <= 'Z' THEN
set result = 98;
else
set Result = 99;
End if;
END if;
RETURN Result;
END;
但是这总会产生以下错误:
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 'IN ZipCode varchar()) RETURNS'
那么格式化SQL调用以在模块的安装/更新脚本中运行以将函数或存储过程插入Maganeto的数据库中的正确方法是什么?
答案 0 :(得分:2)
问题在于您的SQL语句:
您的SQL语法有错误;检查手册...... 要在
附近使用正确的语法'
IN ZipCode varchar()) RETURNS
'
我建议通过PhpMyAdmin或在命令行上运行SQL,直到你正确运行,然后通过Magento运行它。此手册页介绍了CREATE FUNCTION
:http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html的语法。在mysql客户端(或PhpMyAdmin)中测试存储过程/函数时,请确保change the delimiter以便正确解释函数体中的分号。
以下SQL对我有用。我从原始陈述中改变的是:
IN
中不允许使用(IN ZipCode varchar())
varchar
DECLARE
属于函数DETERMINISTIC
,这意味着它总是会为相同的输入参数产生相同的结果。如果不是这种情况,请从DETERMINISTIC
行RETURNS
醇>
试一试:
DROP FUNCTION IF EXISTS {$this->getTable('fn_Get_HardinessZone')};
CREATE FUNCTION {$this->getTable('fn_Get_HardinessZone')} (ZipCode VARCHAR(15))
RETURNS INTEGER DETERMINISTIC
BEGIN
DECLARE result INTEGER;
SELECT MAX(Zone) INTO result
FROM AMI_zones
WHERE (Hfzip <= LEFT(ZipCode, 5)) AND (Htzip >= LEFT(ZipCode, 5));
IF result IS NULL OR result < 1 OR (result > 11 AND result <> 99) THEN
/* if the left most character is alpha, then set the zone to 98 for Canada */
IF LEFT(ZipCode, 1) >= 'A' AND LEFT(ZipCode, 1) <= 'Z' THEN
SET result = 98;
ELSE
SET result = 99;
END IF;
END IF;
RETURN result;
END;