在Magento中为模块创建数据库功能

时间:2012-07-20 19:51:18

标签: mysql sql magento

我在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的数据库中的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

问题在于您的SQL语句:

  

您的SQL语法有错误;检查手册......   要在

附近使用正确的语法      

'IN ZipCode varchar()) RETURNS'

我建议通过PhpMyAdmin或在命令行上运行SQL,直到你正确运行,然后通过Magento运行它。此手册页介绍了CREATE FUNCTIONhttp://dev.mysql.com/doc/refman/5.0/en/create-procedure.html的语法。在mysql客户端(或PhpMyAdmin)中测试存储过程/函数时,请确保change the delimiter以便正确解释函数体中的分号。

以下SQL对我有用。我从原始陈述中改变的是:

    函数声明IN 中不允许使用
  1. (IN ZipCode varchar())
  2. 我被要求明确说明varchar
  3. 的长度
  4. DECLARE属于函数
  5. 我猜你的函数是DETERMINISTIC,这意味着它总是会为相同的输入参数产生相同的结果。如果不是这种情况,请从DETERMINISTIC
  6. 中删除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;