2012-07-20 44 views
2

我在Magento中有一个工作模块,它是在我们安装之外使用的一些自定义代码之后建模的。此模块目前将5个表添加到数据库以存储信息,并且我已将Admin扩展为CRUD信息。这里的最终目标是将这些定制程序的大部分转移到Magento中。在Magento中为模块创建数据库功能

目前我们的自定义代码位于Magento之外,并打到一个单独的数据库。这个数据库具有相同的5个表,一个存储过程和4个函数。我现在想要做的是将存储过程和函数移动到Magento的数据库中,并更改自定义代码以从Magento的数据库中调用它的所有数据。但是,我似乎无法弄清楚应如何为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

您如何执行这个查询? – 2012-07-20 20:03:07

+0

只需确认一下,您已将该功能标记为与您的表名相同的名称? – trickyzter 2012-07-20 20:15:48

+0

@tim这是包含在我的模块中的sql_update.php文件中。所以当我将模块修改为相同的编号时它会被执行。 – 2012-07-20 21:11:20

回答

2

问题是与你的SQL语句:

You have an error in your SQL syntax; check the manual ... for the right syntax to use near

' 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为我工作。我从原来的语句更改的事情是:

  1. IN在函数声明(IN ZipCode varchar())
  2. 我必须明确指出的功能
  3. 我里面的varchar
  4. DECLARE长度属于不允许我猜你的功能是DETERMINISTIC,这意味着它将始终为相同的输入参数产生相同的结果。如果不是这种情况下,从RETURNS线

删除DETERMINISTIC这给一个镜头:

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; 
+0

这似乎是正确的方向,但是当我运行它通过phpmyadmin插入的Magento前进行测试,我得到这个错误并没有在查询在那里此错误的没有空格: 错误 SQL查询: CREATE FUNCTION'fn_Get_HardinessZone '( ZipCode VARCHAR(15) )RETURNS INTEGER DETERMINISTIC BEGIN DECLARE result INTEGER; MySQL说: #1064 - 你的SQL语法错误;检查对应于你的MySQL服务器版本的手册,在第4行''附近使用正确的语法 – 2012-07-25 17:21:21

+0

@GregDemetrick请参阅我发布的有关更改分隔符的注释。这里是明确的说明:http://stackoverflow.com/a/8081096/961455 – nachito 2012-07-25 18:46:24

+0

您的解决方案适用于SQL部分,因为我能够在phpMySQL下运行并创建函数。当涉及到插入过程时,我遇到了http://stackoverflow.com/questions/6983447/magento-stored-procedures-in-sql-upgrade-scripts中提到的问题。谢谢你的帮助! – 2012-07-25 19:04:18