본문 바로가기

빅데이터과정/PL/SQL

#12_140630_PL_SQL_FUNCTION

728x90

# FUNCTION

함수 수행하는 방법  - execute dbms_output.put_line(get_mgr(7788));


문제127. 부서번호를 입력하고 프로시져를 실행하면 해당 부서번호의 평균월급이 출력되는 프로시져를 함수로 변경하시오

CREATE OR REPLACE PROCEDURE avgsal
(p_deptno emp.deptno%type)
IS
 v_avgsal emp.sal%TYPE;
BEGIN
 SELECT AVG(sal) INTO v_avgsal
 FROM EMP
 WHERE deptno = p_deptno;
 dbms_output.put_line('평균월급 ' || v_avgsal);
END;
/ 


CREATE OR REPLACE FUNCTION GET_AVGSAL
(p_deptno IN emp.deptno%type)
RETURN NUMBER
IS
 v_avgsal emp.sal%TYPE;
BEGIN
 SELECT AVG(sal) INTO v_avgsal
 FROM EMP
 WHERE deptno = p_deptno;
RETURN v_avgsal;
END;
/

상단의 return number가 추가되고 dbms가 없어지고 return 변수가 하단에 추가된다.
함수는 select 구문안에만 가능하다



문제128. 부서번호를 입력하면 해당 부서번호의 부서위치가 출력되게 하는 함수를 만들고 아래와 같이 쿼리하시오
select ename, sal, get_loc(deptno)
from emp;

CREATE OR REPLACE FUNCTION get_loc
(p_deptno IN emp.deptno%type)
RETURN character
IS
 v_loc dept.loc%TYPE;
BEGIN
 SELECT loc INTO v_loc
 FROM DEPT
 WHERE deptno = p_deptno;

RETURN v_loc;
END;

/



문제131. 위의 쿼리를 이용해서 프로시져를 생성하는데 순위를 물어보게 하고 순위를 입력하면 해당 그 순위의 퇴직 사유를 출력하시오

CREATE OR REPLACE PROCEDURE retire_rank
(p_rnk IN number)
IS
 v_cause retire_cause.cause%TYPE;

BEGIN
 SELECT cause INTO v_cause
 FROM (SELECT cause, RANK() OVER(ORDER BY bigcomp desc) big, RANK() OVER(ORDER BY smallcomp desc) small FROM retire_cause)
 WHERE big = p_rnk;

 dbms_output.put_line('퇴직사유 ' || v_cause);
END;
/







문제134. 함수를 생성하는데 사원번호를 입력했을 때 해당사원이 관리자인인지 사원인지를 출력하는 함수를 생성하시오그래서 아래와 같이 결과를 출력하시오

select ename, sal, get_mgr(empno)
from emp;

CREATE OR REPLACE FUNCTION get_mgr
(p_empno emp.empno%type)
RETURN CHARACTER
IS
 v_ename emp.ename%TYPE;
 v_char VARCHAR2(20);

BEGIN
SELECT ename, CASE WHEN empno IN (SELECT mgr FROM emp)
THEN '관리자' ELSE '사원' END INTO v_ename, v_char
FROM EMP
WHERE empno = p_empno;

RETURN v_char;
END;


/




문제135. 아래와 같이 결과를 출력하는 함수 get_comp를 생성하시오

create table retire_cause2
as
 select rownum as rn, r.*
 from retire_cause r;

select cause, get_comp(rn)


from retire_cause2;


CREATE OR REPLACE FUNCTION get_comp
(p_rnum IN NUMBER)
RETURN CHARACTER
IS
 v_big  NUMBER(10);
 v_small NUMBER(10);
 v_char VARCHAR2(20);

begin
 SELECT bigcomp, smallcomp INTO v_big, v_small
 FROM retire_cause2
 WHERE rn = p_rnum;

 IF v_big >= v_small THEN
  v_char := '대기업';
 ELSE
  v_char := '중소기업';
 end IF;

RETURN v_char;
END;
/

------------------------------------------------------------------
SELECT * FROM retire_cause2;

CREATE OR REPLACE FUNCTION get_compp
(p_rnum IN NUMBER)
RETURN CHARACTER
IS
 v_char VARCHAR2(20);

BEGIN
SELECT CASE WHEN bigcomp >= smallcomp
 THEN '대기업' ELSE '중소기업' END INTO v_char
FROM retire_cause2
WHERE rn = p_rnum;

RETURN v_char;


END;



문제143. 우리가 그동안 만들었던 함수 리스트를 확인하고 함수를 전부 삭제하시오

SELECT text
FROM user_source
WHERE TYPE='FUNCTION';

SELECT DISTINCT 'drop function '|| NAME ||';'
FROM user_source

WHERE type='FUNCTION';




문제215. 증감율을 사용자 정의함수를 생성해서 함수를 가지고 밑의 쿼리를 이용해서 결과를 아래의 그림과 같이 출력하시오매개변수를 이용.

select ns, fun2(ns), sy, fun2(sy)
from emp2345;






FROM EMP2345;CREATE OR REPLACE FUNCTION fun_ndl
(p_noodle VARCHAR2,
p_hiredate number)
RETURN NUMBER
IS
 v_ndl NUMBER(10);

BEGIN
SELECT cnt INTO v_ndl FROM(
 select hiredate, ROUND(((ns-lag(ns,1) over(order by hiredate asc))/(LAG(ns,1) OVER(ORDER BY hiredate))*100),1) ns,
 ROUND(((sy-lag(sy,1) over(order by hiredate asc))/(LAG(sy,1) OVER(ORDER BY hiredate))*100),1) sy,
 ROUND(((ot-lag(ot,1) over(order by hiredate asc))/(LAG(ot,1) OVER(ORDER BY hiredate))*100),1) ot,
 ROUND(((pd-lag(pd,1) over(order by hiredate asc))/(LAG(pd,1) OVER(ORDER BY hiredate))*100),1) pd
 FROM EMP2345)
 unpivot(cnt FOR noo IN (ns, sy, ot, pd))
WHERE hiredate=p_hiredate AND UPPER(noo)=UPPER(p_noodle);

RETURN v_ndl;
END;
/

SELECT hiredate, ns 농심, fun_ndL('ns',hiredate) 농심증감율 , sy 삼양, fun_ndL('sy',hiredate) 삼양증감율,
ot 오뚜기, fun_ndL('ot',hiredate) 오뚜기증감율, pd 팔도, fun_ndL('pd',hiredate) 팔도증감율

FROM EMP2345;

'빅데이터과정 > PL/SQL ' 카테고리의 다른 글

#13_140701_PL_SQL_REF CURSOR  (0) 2014.07.14
#13_140701_PL_SQL_동적 SQL  (0) 2014.07.14
#10_140627_PL_SQL_WHERE CURRENT OF  (0) 2014.07.14
#11_140627_PL_SQL_예외처리  (0) 2014.07.14
#10_140626_PL_SQL_CURSOR  (0) 2014.07.14