oracle function 질문드립니다. 0 4 2,674

by 백종현 [PL/SQL] function [2015.02.25 21:36:56]


create or replace function manager_avgsal(
    vjob emp.job%type)
    return number
is
    type sal_table_type is table of emp.sal%type
    index by binary_integer;
    sal_table sal_table_type;
    i binary_integer:=0;
    total number:=0;
begin
    for k in (select sal from emp where job=vjob) loop
        i:=i+1;
        sal_table(i):=k.sal;
        total:=total+sal_table(i);
        end loop;
        return(total/i);      
end;
/

위 구문은 scott 계정의 emp 테이블에서 직업(job컬럼)이 manager인 사람들의 급여의 평균을 구하기 위한

저장함수(function)입니다.

제 의도는 다음과 같이 실행하기 위해 execute :var_avg:=manager_avgsal('MANAGER')

---var_avg 는 바인드 변수입니다.---

vjob이라는 매개변수로 manager를 입력받아서

저장함수의 begin 부분에서 for문으로 직업이 manager인 사람의 급여를 모두 조회하고

이를 차례차례 테이블 타입변수에 저장하고 이를 total이라는 number형 변수에 더한 후

리턴할때에 total을 i로 나누면 급여의 평균이 나오지 않을까 생각했는데 실행하면

컴파일은 되지만 에러가 발생합니다.

에러가 발생하는 이유는 무엇일까요?

변수선언은 is문 뒤에 하는것으로 알고 있는데 맞는지요 ?

테이블변수가 사실상은 number형 변수를 담는다 할지라도 테이블타입으로 선언된 변수와

number형 변수는 상호간의 연산이 되지는 않는것인가요 혹시 ?

고수님들의 조언 부탁드립니다.

by 필상 [2015.02.26 09:32:26]

왜 이렇게 하시는지 몰라도 ^__^;;

이부분이 오타 난 거네요

type sal_table_type IS table OF  emp.sal%type


by 백종현 [2015.02.26 09:53:54]

감사합니다. ^^


by 커피요쿠르트d [2015.02.26 09:41:44]

음.. return(total/i);  
요부분에서 i가 0이라거나.. 
오류 메시지 확인 가능하세요?
exception 처리로 dbms_output으로 확인 해봐야 왜 오류가 발생하는지 알 수 있을거 같아요.
소스상으로 보면 특이한 건 없는거 같아요. 말씀하신 변수들 다 계산되고 담기고 합니다. ㅎ


by 백종현 [2015.02.26 09:53:33]

아 제 원본에는 total 이라는 변수대신에 sum으로 해놓았는데 그게 문제였습니다...

sum은 예약어? 라 그런지 안되나봅니다. 감사합니다 고수님들 ^^

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