4

lp_upload を呼び出すテーブルがあり、車のプレート番号とその他の関連情報が含まれています。

CREATE TABLE `lp_upload` (
`date`  date NULL ,
`plate`  char(10) NULL ,
`site`  int NULL ,
`dateid`  char(20) NULL 
)
;

このテーブルは交通カメラから情報を取得しています。ただし、プレート内の文字が認識されず、$ に置き換えられることがあります。したがって、プレートが実際には abc123 であるが、カメラが c と 1 を認識しなかった場合、テーブルに入力されるのは ac$$23 になります。

新しいプレートを入力して既存のプレートと6文字一致するとそのプレートになるようにしようと思います。例: 123$5678 が入力され、12345678 が既に存在する場合、123$5678 は 12345678 に置き換えられます。

だから私は最初にマッチ関数を書きました:

CREATE DEFINER = CURRENT_USER FUNCTION `matchingfun`(`str1` char(10),`str2` char(10))
 RETURNS int

 BEGIN

    DECLARE myindex int DEFAULT 0;
  DECLARE count int DEFAULT 0;
  DECLARE maxlength int;

  SET maxlength = length(str1);
  for_loop: LOOP
    SET myindex = myindex + 1;

    IF maxlength < myindex then 
            RETURN 0;
    END IF;

    IF SUBSTRING(str1,myindex,1)= SUBSTRING(str2,myindex,1)then 
            SET count = count +1;
    END IF;

    IF count > 6 then 
            RETURN 1;
    END IF;

    IF SUBSTRING(str1,myindex,1)!= SUBSTRING(str2,myindex,1) and SUBSTRING(str1,myindex,1)!= '$' and SUBSTRING(str2,myindex,1)!= '$'then 
            RETRUN 0; 
    END IF;

  END LOOP for_loop;
    RETURN 0;
END

テーブルにトリガー関数を追加しました

CREATE TRIGGER `trigger1` AFTER INSERT ON `lpr_opt_upload`
BEGIN

     declare old_site_id int;
     declare old_text char(10);

     select lpr_text into old_text from lpr_opt_upload where matchingfun(new.lpr_text, lpr_text) = 1;
     if(old_text is not null) then
     set new.lpr_text = old_text;
     end if;

END

これを実行すると、データベースがクラッシュします。この問題を解決するのを手伝ったり、これを行うためのより良い方法を提案したりできますか? ありがとう。

4

1 に答える 1

4

あなたが直面している問題は、複数の一致であると思われます。たとえば、データベースに とがabcd01234あり、 を挿入しようとすると、エラーが発生します。abcde1234abcd$1234

ここで、このアプリケーションは、車両所有者の発券を容易にするために、自動速度取締機や赤信号カメラの OCR で処理されたナンバー プレートを照合することになっていると仮定します。その場合は、注意を怠って、システムが複数の候補から自動的に選択しようとするのではなく、実際の人間が結果を見てプレート番号を確認するようにします。

したがって、その仮定に基づいて操作します。

DELIMITER //
CREATE TRIGGER `attempt_match_existing_plate`
  BEFORE INSERT
  ON `lp_upload`
FOR EACH ROW BEGIN
  DECLARE exist_plate CHAR(10);
  DECLARE rowcount INT;
  SELECT COUNT(*), plate INTO rowcount, exist_plate FROM lp_upload WHERE platematch(NEW.plate, plate) = 1;
  IF (1 = rowcount) AND (exist_plate IS NOT NULL) THEN
    SET NEW.plate = exist_plate;
  END IF;
END
//
DELIMITER ;

DELIMITER //
CREATE DEFINER = CURRENT_USER
  FUNCTION `platematch`(`plate_new` char(10), `plate_exist` char(10))
  RETURNS INT
BEGIN
   DECLARE myindex INT DEFAULT 0;
   DECLARE match_count INT DEFAULT 0;
   DECLARE maxlength INT;
   SET maxlength = length(plate_new);
   for_loop: LOOP
      SET myindex = myindex + 1;
      IF maxlength < myindex THEN 
         RETURN 0;
      END IF;
      IF SUBSTRING(plate_new, myindex, 1) = SUBSTRING(plate_exist, myindex, 1)
      THEN 
         SET match_count = match_count +1;
      END IF;
      IF match_count >= 6 THEN 
         RETURN 1;
      END IF;
      IF  SUBSTRING(plate_new, myindex, 1) != SUBSTRING(plate_exist, myindex, 1)
      AND SUBSTRING(plate_new, myindex, 1) != '$'
      AND SUBSTRING(plate_exist, myindex, 1) != '$'
      THEN
         RETURN 0; 
      END IF;
   END LOOP for_loop;
   RETURN 0;
END
//

DELIMITER ;

上記のシナリオではabcd$1234、複数の潜在的な結果の 1 つに自動的に一致するだけでなく、そのままデータベースに挿入されます。

于 2012-06-20T22:10:13.990 に答える