2014-04-30 5 views
0

두 개의 커서를 사용하여 해당 부서에 속한 직원의 부서에 따라 total_sal 열을 업데이트하는 저장 프로 시저를 설계했습니다.저장 프로 시저/커서 논리

올바른 결과를 얻지 못하고 저장 프로 시저 및 커서의 흐름에 잘못된 아이디어가있을 수 있습니다.

나는이 달성하기 위해 사용하려고 논리 : 부서 번호를

3 열려있는 커서를 얻을 부서의 각 행에서 부서

2을 반복하는

1 열려있는 커서를 직원의 부서 번호가 부서의 커서에서 부서 번호와 동일한 경우, 각 직원에서 직원

3- 반복하는, 우리는 total_sum에 자신의 급여를 추가

5 직원 테이블은 우리가 마침내 total_sum과 부서의 total_salary를 업데이트 소진 된 후

- 6 단계에서 다시 시작이 여기에

는 저장 프로 시저입니다 : 여기

CREATE PROCEDURE updateSalary() 
BEGIN 
    DECLARE emp_sal, eDno, dDno INT; 
    DECLARE total_sum INT DEFAULT 0; 
    DECLARE finished INT DEFAULT 0; 
    DECLARE dep_cursor CURSOR FOR SELECT Dno FROM Department; 
    DECLARE emp_cursor CURSOR FOR SELECT Dno, Salary FROM Employee; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1; 

    open dep_cursor; 
    department_loop: LOOP 
    FETCH dep_cursor INTO dDno; 
    IF finished = 1 THEN 
     LEAVE department_loop; 
    END IF; 

    open emp_cursor; 

    employee_loop: LOOP 
     FETCH emp_cursor INTO eDno, emp_sal; 
     IF eDno = dDno THEN 
     SET total_sum = total_sum + emp_sal; 
     END IF; 
     IF finished = 1 THEN 
     update department SET total_sal = total_sum WHERE department.dno = dDno; 
     LEAVE employee_loop; 
     END IF; 
     SET total_sum = 0; 
    END LOOP employee_loop; 
    close emp_cursor; 
    END LOOP department_loop; 
    CLOSE dep_cursor; 
END; 
/

가있다 SQLFiddle 나는 함께 일해 왔습니다. http://sqlfiddle.com/#!2/b9cc2f/1/1

저는 자바 디버깅에 익숙하지 않습니다. 만약 이것이 Java라면, 어떤 인쇄 진술을 던져서 무슨 일이 일어나는지 보겠습니다. 엔.

+0

저장 프로 시저를 사용하여 모든 happies, 당신은 그것을 호출 할 필요가 한 부서에서 기록을 변경할 때마다 대신 dept 테이블에서 total_sal 값의 자동 업데이트를 유발하는 트리거를 사용하십시오. –

+0

@Ravinder 이것은 저장 프로 시저와 커서를 사용해야하는 할당입니다. –

답변

1

저장 프로 시저에 몇 가지 논리 오류가 있습니다. cursor의 부적절한 취급으로 인해 fetch 상태가 완료되었습니다.

커서에 대한 할당이라고 언급 했으므로 원하는 조치를 수행하기위한 몇 가지 단계를 제안합니다.

  1. dnodno 그룹화 salary의 합 직원에 커서를 선언.
  2. 열기
  3. 통해 동일한 커서 루프 아니라면 finished 다음, EMP 커서 위에서 페치 값 단일 문 update deparment. where 절에 dno을 가져 오십시오.
  4. 하면 완료 한 다음 닫기 EMP 커서
  5. 최종 절차
  6. 통화 절차
  7. 선택은 모든 부서
    에서 - 결과 집합을 보여줍니다 :
관련 문제