영보의 SystemOut.log

[Oracle]PL/SQL- CURSOR/PROCEDURE vs FUNCTION 과 예제 본문

Database/Oracle

[Oracle]PL/SQL- CURSOR/PROCEDURE vs FUNCTION 과 예제

영보로그 2020. 11. 13. 00:21
반응형

 개념 정리

 

# CURSOR

개념
  여러 개의 row(record)를 저장할 수 있는 공간 (자바에서의 ResultSet)
 
처리
 
cursor → 자바(resultSet) 

커서 사용법 
   1. 커서 등록 

        Cursor cur_name IS 
        SELECT * FROM emp 
    2. open 
    3. fetch 
    4. close 

 

 

 

# PROCEDURE vs FUNCTION

구분 PROCEDURE
FUNCTION

개념
  - 리턴형이 없는 함수
  - DML, 페이징  

  - 보안이 좋음, 캐시메모리에 저장
  - 속도가 빠름, 트랜잭션 제어 


  리턴형이 있는 함수 →  JOIN,SUBQUERY 대신 처리

형식
    CREATE OR REPLACE PROCEDURE por_name( 

     매개변수 
      = IN : SQL문장 실행시 필요한 데이터
    →WHERE, INSERT, UPDATE, DELETE 

      = OUT : SQL문장 실행 결과값을 가지고 올 때 SELECT 
    ) 
     IS(AS) 
        변수 
     BEGIN 
        SQL 구현 
     END; 
      / 

    CREATE OR REPLACE FUNCTION func_name( 
          매개변수 (OUT 변수가 존재하지 않음
                      →RETURN 을 가지고 있기 때문) 

      )RETURN 데이터형 
       IS(AS) 
            변수 
       BEGIN
            SQL 구현 
       RETURN 결과값 
       END; 
       / 

 

 

 

 

 

 예제

 

# CURSOR

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SELECT * FROM dept;
 
SET serveroutput on;
DECLARE
    vemp emp%ROWTYPE;
    CURSOR cur IS
        SELECT * FROM emp;
BEGIN
    OPEN cur;
    DBMS_OUTPUT.PUT_LINE('===결과===');
    LOOP
    FETCH cur INTO vemp;
        EXIT WHEN cur%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE('사번:'||vemp.empno);
        DBMS_OUTPUT.PUT_LINE('이름:'||vemp.ename);
        DBMS_OUTPUT.PUT_LINE('직위:'||vemp.job);
        DBMS_OUTPUT.PUT_LINE('입사일:'||vemp.hiredate);
        DBMS_OUTPUT.PUT_LINE('급여:'||vemp.sal);
    END LOOP;
    CLOSE cur;
END;
 
cs

 

 

 

 

 

 

 

qh5944.tistory.com/100

 

[Oracle] PL/SQL- Procedure(프로시저)와 예제

 개념 # PROCEDURE 프로시저  - 특정 작업을 수행 하는, 이름이 있는 PL/SQL BLOCK  - 매개 변수를 받을 수 있고, 반복적으로 사용 할 수 있는 BLOCK  - 보통 연속 실행 또는 구현이 복잡한 트랜잭션을 수

qh5944.tistory.com

앞서 만든 테이블에 이어서 작성해보겠습니다.

# 평균 구하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
--평균
CREATE OR REPLACE FUNCTION studentAvg(
    pNo pl_student.hakbun%TYPE
)RETURN NUMBER
IS
    pAvg NUMBER;
BEGIN
    SELECT (kor+eng+math)/3 INTO pAvg
    FROM pl_student
    WHERE hakbun=pNo;
    
    RETURN pAvg;
END;
/
 
cs

 

 

 

# 총점 구하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
--총점
CREATE OR REPLACE FUNCTION studentTotal(
    pNo pl_student.hakbun%TYPE
)RETURN NUMBER
IS
    pTotal NUMBER;
BEGIN
    SELECT kor+eng+math INTO pTotal
    FROM pl_student
    WHERE hakbun=pNo;
    
    RETURN pTotal;
END;
/
 
cs

 

 

 

# 조회

1
2
SELECT name,kor,eng,math,studentAvg(hakbun),studentTotal(hakbun)
FROM pl_student;
cs
1
2
3
4
5
6
7
SELECT ename,job,dname,loc
FROM emp,dept
WHERE emp.deptno=dept.deptno;
 
SELECT ename,job,(SELECT dname FROM dept d WHERE d.deptno=e.deptno) as dname,
    (SELECT loc FROM dept d WHERE d.deptno=e.deptno) as loc
FROM emp e;
cs

 

 

 

# FUNCTION

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
CREATE OR REPLACE FUNCTION getDname(
    pDeptno emp.deptno%TYPE
)RETURN VARCHAR
IS
    vdname dept.dname%TYPE;
BEGIN
    SELECT dname INTO vdname
    FROM dept
    WHERE deptno=pDeptno;
    RETURN vdname;
END;
/
 
SELECT ename,job,getDname(deptno) FROM emp;
 
--
CREATE OR REPLACE FUNCTION getLoc(
    pDeptno emp.deptno%TYPE
)RETURN VARCHAR
IS
    vdname dept.dname%TYPE;
BEGIN
    SELECT loc INTO vdname
    FROM dept
    WHERE deptno=pDeptno;
    RETURN vdname;
END;
/
 
cs

 

 

 

반응형