오라클 패키지(Oracle Package) 실습 동영상, One Time Only Procedure, 오라클교육/오라클학원/ORACLE교육/ORACLE학원/자바교육/JAVA학원/자바동영상
http://ojc.asia/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=718
ojc.asia
http://ojc.asia/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=717
ojc.asia
https://www.youtube.com/watch?v=EZl9trYM1HM&list=PLxU-iZCqT52CfP98Y4gCDKIm52tKvgy36&index=23

https://www.youtube.com/watch?v=qIQOpqpNzpA&list=PLxU-iZCqT52CfP98Y4gCDKIm52tKvgy36&index=24

https://www.youtube.com/watch?v=Ub3XCyENie0&list=PLxU-iZCqT52CfP98Y4gCDKIm52tKvgy36&index=25

오라클 PL/SQL
오라클 패키지 실습
ONE TIME ONLY PROCEDURE란?
강의 : 이종철
ONE TIME ONLY PROCEDURE
- 객체지향 프로그래밍의 초기화블록 처럼 패키지에서도 초기화 블록이 존재하는데 패키지내 함수나 프로시저가 최초 호출될 때 딱한번 호출되는 BEGIN~END 절을 만들 수 있는데 이를 One Time Only 프로시저라고 하고 주로 패키지내에서의 데이터 초기화 작업을 수행 합니다.
- 패키지 바디의 맨 뒤쪽에 기술한다.
-- 이번에는 좀더 복잡한 패키지를 만들어 보자.
SQL> create table emp_log (
log_date date,
log_user varchar2(50),
program varchar2(50)
);
테이블이 생성되었습니다.
SQL> CREATE OR REPLACE PACKAGE emp_pkg AS
/* 외부에서 접근가능한 TYPE, CURSOR, EXCEPTION */
TYPE EmpRecType IS RECORD (ename emp.ename%TYPE, sal emp.sal%TYPE);
CURSOR desc_sal RETURN EmpRecType; -- 커서를 패치할 때 EmpRecType으로 받아야 함
/* emp 테이블의 insert 건수를 기록, 전역변수 */
insert_cnt NUMBER;
/* 외부에서 호출 가능한 서브 프로그램들 */
FUNCTION insert_emp (
p_ename emp.ename%TYPE,
p_sal emp.sal%TYPE,
p_deptno dept.deptno%TYPE) RETURN emp.empno%TYPE;
PROCEDURE fire_emp (p_empno emp.empno%TYPE);
FUNCTION nth_highest_sal (p_rank NUMBER) RETURN EmpRecType;
END emp_pkg;
/
패키지가 생성되었습니다.
SQL> CREATE OR REPLACE PACKAGE BODY emp_pkg
IS
/* desc_sal 커서에 대한 구현부 */
CURSOR desc_sal RETURN EmpRecType IS
SELECT ename, sal FROM emp ORDER BY sal DESC;
/* insert_emp 함수의 구현부 */
FUNCTION insert_emp (
p_ename emp.ename%TYPE,
p_sal emp.sal%TYPE,
p_deptno dept.deptno%TYPE) RETURN emp.empno%TYPE
IS
new_empno NUMBER(5);
BEGIN
SELECT max(empno) + 1 into new_empno FROM EMP;
INSERT INTO emp (empno, ename, sal, deptno)
VALUES (
new_empno,
p_ename,
p_sal,
p_deptno
);
COMMIT;
insert_cnt := insert_cnt + 1;
RETURN new_empno;
END insert_emp;
/* fire_emp 프로시저 구현부 */
PROCEDURE fire_emp (p_empno emp.empno%TYPE)
IS
BEGIN
DELETE FROM emp WHERE empno = p_empno;
COMMIT;
END fire_emp;
/* nth_highest_salary함수 구현부
급여 순위 몇번째에 해당 하는 사원 리턴 */
FUNCTION nth_highest_sal (p_rank NUMBER) RETURN EmpRecType
IS
--커서가 리턴하는 EmpRecType을 받기위한 변수
emp_rec EmpRecType;
BEGIN
OPEN desc_sal; --패키지에서 정의한 전역커서 사용
FOR i IN 1..p_rank LOOP
-- 커서의 리턴형이 EmpRecType이므로,
FETCH desc_sal INTO emp_rec; END LOOP;
CLOSE desc_sal;
RETURN emp_rec;
END nth_highest_sal;
-- 패키지가 최초 호출될 때 한번만 호출
-- one time only procedure
BEGIN
INSERT INTO emp_log VALUES (SYSDATE, USER, 'EMP_PKG');
COMMIT;
insert_cnt := 0;
* END emp_pkg;
/
패키지 본문이 생성되었습니다.
SQL> variable empno number
SQL> exec :empno := emp_pkg.insert_emp('이종철',9990, 30)
PL/SQL 처리가 정상적으로 완료되었습니다.
SQL> print empno
EMPNO
----------
10000
SQL> exec emp_pkg.fire_emp(10000)
PL/SQL 처리가 정상적으로 완료되었습니다.
SQL> select empno, ename from emp where empno = 10000;
선택된 레코드가 없습니다.
SQL> set serveroutput on
SQL> DECLARE
emp_rec emp_pkg.EmpRecType;
BEGIN
emp_rec := emp_pkg.nth_highest_sal(1);
dbms_output.put_line('급여 최고높은 사원 :' || emp_rec.ename);
END;
/
급여 최고높은 사원 :오라클자바커뮤니티
SQL> BEGIN
DBMS_OUTPUT.PUT_LINE('insert 건수 :' || emp_pkg.insert_cnt);
END;
/
insert 건수 :1
SQL> select * from emp_log;
LOG_DATE LOG_USER PROGRAM
-------- -------------------------------------------------- --------
16/01/01 SCOTT