2010-06-17 4 views
1

저장 프로 시저를 다른 함수와 결합 할 때 도움이 필요합니다.MySQL : 저장 프로 시저를 다른 함수와 어떻게 결합합니까?

데이터베이스에서 위도와 경도를 가져 오는 저장 프로 시저가 있습니다. 포인트가 다각형 안에 있는지 확인하는 또 다른 함수가 있습니다. 내 목표는 두 가지 기능을 결합하여 DB에서 가져온 위도 및 경도 포인트가 특정 영역 내에 있는지 확인할 수 있도록하는 것입니다.

이 프로 시저가 공격에 기초하여 상기 데이터베이스로부터 위도와 경도를 당긴 : 점이 다각형 내부

DROP PROCEDURE IF EXISTS latlongGrabber; 
DELIMITER $$ 
CREATE PROCEDURE latlongGrabber(IN offense_in VARCHAR(255)) 

BEGIN 
    DECLARE latitude_val VARCHAR(255); 
    DECLARE longitude_val VARCHAR(255); 
    DECLARE no_more_rows BOOLEAN; 
    DECLARE latlongGrabber_cur CURSOR FOR 

    SELECT latitude, longitude FROM myTable WHERE offense = offense_in; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows = TRUE; 

OPEN latlongGrabber_cur; 


the_loop: LOOP 

FETCH latlongGrabber_cur 
INTO latitude_val, longitude_val; 

IF no_more_rows THEN CLOSE latlongGrabber_cur; 
LEAVE the_loop; 
END IF; 
SELECT latitude_val, longitude_val; 
END LOOP the_loop; 
END 
$$ 
DELIMITER ; 

이 기능 검사 여부. 프로 시저에서 생성 된 점을 테스트하는 기능을 원합니다. 지금은 다각형을 하드 코딩 할 수 있습니다. (일단이 두 함수를 결합하는 방법을 알았다면 동일한 패턴을 사용하여 데이터베이스에서 다각형을 가져올 것입니다.)

SET @point = PointFromText('POINT(5 5)') ; 
SET @polygon = PolyFromText('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'); 
SELECT myWithin(@point, @polygon) AS result 

내가 저장 프로 시저 및 기능을 테스트 한 그들은 잘 작동 다음과 같이

DROP FUNCTION IF EXISTS myWithin; 
DELIMITER $$ 
CREATE FUNCTION myWithin(p POINT, poly POLYGON) RETURNS INT(1) DETERMINISTIC 
BEGIN 
DECLARE n INT DEFAULT 0; 
DECLARE pX DECIMAL(9,6); 
DECLARE pY DECIMAL(9,6); 
DECLARE ls LINESTRING; 
DECLARE poly1 POINT; 
DECLARE poly1X DECIMAL(9,6); 
DECLARE poly1Y DECIMAL(9,6); 
DECLARE poly2 POINT; 
DECLARE poly2X DECIMAL(9,6); 
DECLARE poly2Y DECIMAL(9,6); 
DECLARE i INT DEFAULT 0; 
DECLARE result INT(1) DEFAULT 0; 
SET pX = X(p); 
SET pY = Y(p); 
SET ls = ExteriorRing(poly); 
SET poly2 = EndPoint(ls); 
SET poly2X = X(poly2); 
SET poly2Y = Y(poly2); 
SET n = NumPoints(ls); 
WHILE i<n DO 
SET poly1 = PointN(ls, (i+1)); 
SET poly1X = X(poly1); 
SET poly1Y = Y(poly1); 
IF ((((poly1X <= pX) 
&& (pX < poly2X)) || ((poly2X <= pX) 
&& (pX < poly1X))) 
&& (pY > (poly2Y - poly1Y) * (pX - poly1X)/(poly2X - poly1X) + poly1Y)) THEN 
SET result = !result; 
END IF; 
SET poly2X = poly1X; 
SET poly2Y = poly1Y; 
SET i = i + 1; 
END WHILE; 
RETURN result; 
End 
$$ 
DELIMITER ; 

이 함수가 호출됩니다. 나는 그들을 결합하는 방법을 알아 내야 만합니다. 나는 범죄 매개 변수를 사용하여 프로 시저를 호출하고 데이터베이스에서 가져온 모든 위도와 경도를 테스트하여 다각형의 안쪽인지 바깥 쪽인지 확인합니다.

어떤 조언이나 제안이 있으십니까?

감사합니다. MySQL의의 포럼에서

-Laxmidi

+0

안녕, 는 저장 프로 시저 내에서 함수를 호출하고 위도 갈망의 각 세트에 대해 실행 한 방법이 있나요? 감사합니다. – Laxmidi

+0

안녕하세요, 나는 이와 같은 일을하고 싶습니다 : http://www.java2s.com/Code/SQL/Procedure-Function/Callanotherfunction.htm 함수는 저장 프로 시저 내에서 호출됩니다. 내 상황에 어떻게 적응시킬 수 있습니까? 감사합니다. – Laxmidi

답변

0

차드 날이 문제를 해결 도움 :

SELECT myWithin(
POINTFROMTEXT(CONCAT('POINT(', latitude, ' ', longitude, ')')) , POLYFROMTEXT('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))') 
)AS result, latitude, longitude 
FROM myTable 

내가 단순히 함수를 호출하는 SELECT 문을 사용할 수 있습니다. 결국 저장 프로 시저가 필요하지 않았습니다.

감사합니다.

-Laxmidi

관련 문제