database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 30794 게시물 읽기
No. 30794
프로시져 중첩커서 사용 인서트문 입니다 ㅜ
작성자
도와주세요
작성일
2014-11-17 23:30
조회수
9,459

DROP PROCEDURE IF EXISTS sdm.AUTO_JOB_ALLOCATION_TEST1;

CREATE PROCEDURE sdm.`AUTO_JOB_ALLOCATION_TEST1`()

BEGIN

declare iCqtCount int default 0;

declare iJobcount int;

declare iJobcount1 int default 0;

declare iBuildingNo int;

declare i_distance int;

declare i_cqtBuildingNo int;

declare iIdx int;

DECLARE iCursorLoop int default FALSE;

DECLARE setting_cursor CURSOR FOR

SELECT jobcount, standardBuildingNo

FROM cqtautosetting;

DECLARE product_cursor CURSOR FOR

SELECT

( 6371 * acos(cos(radians( CAST((select buildingLat from cqtbuilding where cqtBuildingNo = iBuildingNo ) AS DECIMAL(50,5))))

* cos(radians(buildingLat))

* cos(radians(buildingLng) - radians(CAST((select buildingLng from cqtbuilding where cqtBuildingNo = iBuildingNo ) AS DECIMAL(50,5))))

+ sin(radians(CAST((select buildingLat from cqtbuilding where cqtBuildingNo = iBuildingNo ) AS DECIMAL(50,5)))) * sin(radians(buildingLat)))) AS distance,

cqtBuil.cqtBuildingNo

FROM cqtbuilding as cqtBuil

LEFT OUTER JOIN

(SELECT * FROM cqtauto

WHERE cqtauto.idx = (SELECT MAX(idx) FROM cqtauto))

AS cqtAu

ON cqtAu.cqtBuildingNo = cqtBuil.cqtBuildingNo

WHERE cqtAu.cqtAutoNo IS NULL

ORDER BY distance

LIMIT 0, iJobcount;

 

DECLARE CONTINUE HANDLER FOR NOT FOUND SET iCursorLoop := TRUE;

 

SELECT count(*)

INTO iCqtCount

FROM cqtautosetting;

 

SELECT MAX(idx)+1

INTO iIdx

FROM cqtauto;

 

IF iCqtCount != 0 then

OPEN setting_cursor;

setting_loop: LOOP

FETCH setting_cursor INTO iJobcount, iBuildingNo;

 

IF iCursorLoop THEN

CLOSE setting_cursor;

LEAVE setting_loop;

END IF;

 

OPEN product_cursor;

 

FETCH product_cursor INTO i_distance, i_cqtBuildingNo;

 

product_loop: LOOP

 

IF iCursorLoop THEN

SET iCursorLoop := FALSE;

CLOSE product_cursor;

LEAVE product_loop;

END IF;

 

INSERT INTO cqtauto

(

cqtBuildingNo,

cqtUserNo,

regiDate,

regiId,

idx

)

VALUES

(

i_cqtBuildingNo,

1,

NOW(),

'admin',

iIdx

);

END LOOP product_loop;

 

END LOOP setting_loop;

 

END IF;

 

END;

 

----------------------------------------------------------------------

 

setting_cursor의 쿼리

SELECT jobcount, standardBuildingNo

FROM cqtautosetting;

의 결과가

 

jobcount standardBuildingNo

------------------------------

4 4

5 2

5 32

 

일때

 

iJobcount 와 iBuildingNo 를 LOOP 돌리며 하단의 product_cursor 에 맴핑하여 돌릴 생각 입니다.

 

product_cursor 의 쿼리 ( 위경도를 받아와 가장 가까운 곳의 빌딩을 찾는 쿼리입니다)

 

SELECT

( 6371 * acos(cos(radians( CAST((select buildingLat from cqtbuilding where cqtBuildingNo = iBuildingNo ) AS DECIMAL(50,5))))

* cos(radians(buildingLat))

* cos(radians(buildingLng) - radians(CAST((select buildingLng from cqtbuilding where cqtBuildingNo = iBuildingNo ) AS DECIMAL(50,5))))

+ sin(radians(CAST((select buildingLat from cqtbuilding where cqtBuildingNo = iBuildingNo ) AS DECIMAL(50,5)))) * sin(radians(buildingLat)))) AS distance,

cqtBuil.cqtBuildingNo

FROM cqtbuilding as cqtBuil

LEFT OUTER JOIN

(SELECT * FROM cqtauto

WHERE cqtauto.idx = (SELECT MAX(idx) FROM cqtauto))

AS cqtAu

ON cqtAu.cqtBuildingNo = cqtBuil.cqtBuildingNo

WHERE cqtAu.cqtAutoNo IS NULL

ORDER BY distance

LIMIT 0, iJobcount;

 

입니다 그런데 무한 루프가 ㅜㅜ 도네요...

도움 요청 드립니다

[Top]
No.
제목
작성자
작성일
조회
30797mysql DB 자체내에서는 이런기능 없나요? [1]
이기자
2014-11-24
8487
30796Oracle 서브쿼리를 Mysql 쿼리로 (rownum -> limit) [1]
개발자cheon
2014-11-24
8240
30795mysql outer join시 merge안하기
지나가다
2014-11-19
8585
30794프로시져 중첩커서 사용 인서트문 입니다 ㅜ
도와주세요
2014-11-17
9459
30793암호를 암호화하는 동안 오류가 발생했습니다. 연결이 닫혔습니다.
류준우
2014-11-17
8560
30792도와주세요~!!세로의 값을 가변적으로 가로로 출력 [2]
yhs
2014-11-11
9321
30791년도 목록 쿼리 질문 드립니다.ㅠㅠ [1]
테르
2014-11-11
8804
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다