2012-07-20 69 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