2

インストールの外部で使用するカスタムコードをモデルにしたMagentoの作業モジュールがあります。このモジュールは現在、データベースに 5 つのテーブルを追加して情報を保存しています。管理者を拡張して情報を CRUD しました。ここでの最終的な目標は、このカスタム プログラミングの大部分を 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'

では、関数またはストアド プロシージャを Maganeto のデータベースに挿入するために、モジュールのインストール/更新スクリプトで実行される SQL 呼び出しをフォーマットする適切な方法は何ですか?

4

1 に答える 1

2

問題は SQL ステートメントにあります。

SQL 構文にエラーがあります。マニュアルを確認してください...近くで使用する正しい構文について

' IN ZipCode varchar()) RETURNS'

PhpMyAdmin またはコマンド ラインを使用して SQL を実行することをお勧めします。問題が解決しない場合は、Magento を使用して実行してください。この man ページでは、 http CREATE FUNCTION: //dev.mysql.com/doc/refman/5.0/en/create-procedure.htmlの構文について説明しています。mysql クライアント (または PhpMyAdmin) でストアド プロシージャ/関数をテストする場合は、関数本体のセミコロンが正しく解釈されるように区切り文字を変更してください。

以下のSQLは私にとってはうまくいきました。あなたの元の声明から私が変更した点は次のとおりです。

  1. INは関数宣言では許可されていません(IN ZipCode varchar())
  2. 長さを明示する必要がありましたvarchar
  3. 関数内にDECLARE属します
  4. あなたの関数は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;
于 2012-07-24T04:23:58.703 に答える