2012-06-18 7 views
4

나는 테이블 통화 lp_upload을 가지고 있고 그것은 자동차와 기타 관련 정보의 번호판 포함 : 교통 카메라에서MySQL의 트리거 기능

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

이 테이블지고 정보. 그러나 접시에 언젠가는 문자가 인식되지 않고 $로 대체됩니다. 따라서 접시가 실제로 abc123이지만 카메라가 c와 1을 인식하지 못하면 테이블에 들어가는 ac $$ 23이됩니다.

메신저 새 플레이트를 입력하고 글자 중 6 개가 기존 플레이트와 일치하면 해당 플레이트가됩니다. EX : 123 $ 5678를 입력하고 12345678은 이미 $ 5678 (123) 12345678

에 의해 대체 될 것이다 다음, 존재 그래서 내가 먼저 match 함수 작성 :

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 

내가 이것을 실행할 때 데이터베이스가 충돌합니다. 이 문제를 해결하거나 더 나은 방법을 제안 할 수 있습니까? 감사.

+0

'RETRUN 0;'에서 팁오 (이유가 아님) – Sebas

+0

"데이터베이스 충돌"에 대해 자세히 설명해 주시겠습니까? "크래시"란 무엇을 의미합니까? 받은 오류 코드는 무엇입니까? –

답변

4

실행중인 문제가 여러 번 일치한다고 생각합니다. 예를 들어 데이터베이스에 abcdabcde1234이 있고 abcd$1234을 삽입하려고하면 오류가 발생합니다.

이제 저는 차량 소유자의 발권을 용이하게하기 위해이 응용 프로그램이 속도 카메라 또는 적외선 카메라의 OCR'd 번호판과 일치한다고 가정하겠습니다. 그렇다면 시스템을주의 깊게 잘못 선택하고 시스템이 자동으로 여러 후보자를 선택하려고 시도하지 않고 그 대신 실제 결과를 확인하고 플레이트 번호를 확인하십시오.

그래서, 가정에서 작동 : 대신 자동으로 여러 잠재적 인 결과 중 하나와 일치되는 그대로

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 데이터베이스에 삽입됩니다.

+0

감사합니다. 귀하의 솔루션은 많은 도움이되었습니다. 당신의 솔루션을 사용한 후에, 나는 여전히 "칼럼 플레이트에 비해 너무 긴 MySQL"1406 데이터를 얻고 프로그램을 실행하는 데 오랜 시간이 걸린다. 그래서 날짜> DATE_ADD (CURRENT_TIMESTAMP, INTERVAL -10 분)를 추가하여 최근 항목 만 보았습니다. 이제 작동합니다. – help