PL/SQL 함수 내에 커서 사용 질문드립니다 0 1 595

by 포다닥 [PL/SQL] [2019.11.27 22:43:37]


안녕하세요 PL/SQL 공부중인 학생입니다!

부서별로 제일 높은급여와 제일 낮은 급여를 뺀 급여차를 출력하는 함수를 만들고싶은데요.

함수 매개변수로 부서번호를 받아서 그 부서의 급여차를 빼는 함수는 만들었는데

매개변수를 받지않고 함수 내에서 커서를 이용해서 모든 부서별 급여차를 출력하는 함수는 자꾸 에러가 뜨네요ㅠㅠ

CREATE OR REPLACE FUNCTION sal_test
return NUMBER
IS
  CURSOR c1
  IS
    SELECT deptno, SAL
    FROM employees; 
  vno employees.deptno%TYPE;
    sal1 employees.sal%TYPE;
  
BEGIN
  OPEN c1;
    SELECT max(sal)-min(sal) INTO sal1
    FROM EMPLOYEES
    group by deptno;
  RETURN sal1;

LOOP
  FETCH c1 INTO vno ,sal1;
  EXIT WHEN c1%NOTFOUND;
  DBMS_OUTPUT.PUT_LINE(vno||' '||sal1);
END LOOP;  
CLOSE c1;
END;
/

함수 컴파일 할때는 잘 됐다가

select sal_test() from dual;로 출력하려하면

ORA-01422: 실제 인출은 요구된 것보다 많은 수의 행을 추출합니다
ORA-06512: "SCOTT.SAL_TEST",  13행 라는 에러가 뜹니다...

뭐가 잘못된건지도 모르겠어서 질문드립니다ㅜㅜ

 

by 마농 [2019.11.28 09:02:17]

1. SELECT ~ INTO 구문의 위치 및 사용법이 틀렸네요.
 - LOOP 안에서 c1 으로 부터 받아온 부서번호를 조건으로 줘야죠.
2. 함수에 대한 이해가 필요합니다.
 - 함수는 1개의 결과값을 리턴합니다.
 - 루프 돌면서 계속해서 값을 리턴할 수는 없겟죠.
3. 여러개의 결과값을 받는 함수를 만들려면?
 - 이런 방식으로는 안됩니다.
 - http://gurubee.net/article/11403

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입