4

我有一个名为 lp_upload 的表,它包含汽车的车牌号和其他相关信息:

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

此表正在从交通摄像头获取信息。但是,有时盘子中的字母无法识别,它将被替换为 $。因此,如果一个盘子确实是 abc123,但相机没有识别出 c 和 1,则进入 table 的将是 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

我怀疑您遇到的问题是多个匹配项。例如,如果你在数据库中有abcd01234andabcde1234并尝试插入abcd$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将按原样插入数据库,而不是自动匹配多个潜在结果之一。

于 2012-06-20T22:10:13.990 回答