2013-06-07 3 views
0

여기에 문제가 있습니다. temprequest는 행을 가져 오는 테이블입니다. 가져 오는 동안 temprequest 테이블을 기반으로 제공 가능한 테이블의 deliverableId 열을 조회합니다. 그러므로 나는 select into 문을 사용한다. 하지만 look up 값을 넣는 변수는 가져온 첫 번째 행에 대해서만 작동합니다. 'select into'문이 커서가있는 mysql 저장 프로 시저에서 작동하지 않습니다.

는 '말을 시작'블록 :

DECLARE no_more_rows BOOLEAN; 
DECLARE nr_rows INT DEFAULT 0; 
DECLARE loop_cntr INT DEFAULT 0; 

declare delId int; 

declare vtname varchar(200); 
declare tversion varchar(200); 
declare custId int; 
declare prod varchar(200); 

DECLARE c_temp CURSOR FOR select tname, version,BuID,BuprodName from temprequest; 
SET no_more_rows = False; 

OPEN c_temp; 
select FOUND_ROWS() into nr_rows; 

the_loop:LOOP 
    FETCH c_temp into vtname,tversion,custId, prod; 
    IF no_more_rows THEN    
     LEAVE the_loop; 
    END IF; 
    -- statements for each request record 
    Set delId= (SELECT deliverableId 
       FROM deliverable 
       WHERE deliverable.Product_prodName =vtname AND deliverable.version = tversion); 
    INSERT INTO request VALUES (delId, custId, prod);    
    SET loop_cntr = loop_cntr + 1; 

END LOOP the_loop; 
CLOSE c_temp; 
+0

가'no_more_rows'이 코드에서 사용되지 않습니다 ... 그것은해야하지 :'TRUE SET의 no_more_rows =를 찾을 수 없음위한 DECLARE 핸들러를 계속,'또는'no_more_rows = 경우 nr_rows = loop_cntrl 다음 TRUE 다른 FALSE ' ? – Stoleg

+0

테이블에 읽을 행이 더 이상 없을 때 no_more_rows가 자동으로 false로 설정됩니다. – user2463263

+0

실제로 문제는 'select into'문입니다. – user2463263

답변

0

가 커서 사용 (업데이트)하지 않고 동일한 작업을 수행하려면 :

INSERT INTO request 
SELECT 
    deliverable.deliverableId as delId, 
    qwe.BuID   as custId, 
    qwe.BuprodName   as prod 

FROM deliverable 
inner join 
(select tname, version, BuID,BuprodName 
from temprequest) 
    as qwe (tname, version, BuID,BuprodName) 
     on deliverable.Product_prodName = qwe.vtname 
     AND deliverable.version = qwe.tversion 

난 그냥 BuIDBuprodName 상수가 여기에 있음을 깨달았다 insert 문 이외에는 사용되지 않습니다.

+0

공유 해 주셔서 감사하지만 작동하지 않습니다. 하위 쿼리는 많은 행을 반환합니다. 왜냐하면 temprequest에서 나는 실제 데이터를 채우기 위해 데이터를 읽는 데만 많은 중복 (이것은 테이블과 키 PK입니다)이 있기 때문입니다. 아마도 다른 방법이 없을까요? – user2463263

0

no_more_rows 변수는 커서 내의 어떤 쿼리도 결과를 가져 오지 않으면 true로 설정됩니다. 다음 쿼리가 결과를 가져 오지 않으면이 경우에도 no_more_rowstrue으로 평가됩니다. 이것에 대한

SELECT deliverableId 
FROM deliverable 
WHERE deliverable.Product_prodName =vtname AND deliverable.version = tversion 

솔루션은 커서 실행 중에 true로 평가되는 경우에도 반환 행이없는 경우에만,이 초기화되고 종료 될 수 있도록, 커서의 끝에서 false로 no_more_rows을 설정하는 것입니다 커서 쿼리에 의해.

he_loop:LOOP 
    FETCH c_temp into vtname,tversion,custId, prod; 
    IF no_more_rows THEN    
     LEAVE the_loop; 
    END IF; 
    -- statements for each request record 
    Set delId= (SELECT deliverableId 
       FROM deliverable 
       WHERE deliverable.Product_prodName =vtname AND deliverable.version = tversion); 
    INSERT INTO request VALUES (delId, custId, prod);    
    SET loop_cntr = loop_cntr + 1; 
    SET no_more_row = false 
END LOOP the_loop; 
+0

이것을 처리하는 더 깔끔한 방법은 중첩 된 BEGIN/END 블록에서 SELECT INTO를 선언하는 것입니다. –

관련 문제