DBMS/Oracle
저장 프로시저 , 패키지, 트리거, 함수
구일일구
2022. 11. 25. 16:42
반응형
저장 프로시저 , 패키지, 트리거, 함수
프로시저나 함수는 myBatis에서 동적쿼리로 대신 가능.
트리거는 이벤트를 줘서 특정 테이블에 인서트가 된다면,업데이트가 된다면과 같은 조건을 가지고 작업함 => 트리거에 대해 공부해야함
프로시저를 한데 묶어주는 것이 패키지
특정 테이블의 데이터에 변경이 되었을 때, 자동으로 수행되는 트리거
저장 프로시저
자주 사용되는 쿼리문을 모듈화시켜서 필요할 때마다 호출하여 사용하는 것
SET SERVEROUTPUT ON --결과를 보기 위한 설정
create or replace procedure EMPOUTProc --이미 프로시저가 있다면, 수정(REPLACE)함
IS
vemp emp%rowtype; --변수 선언
cursor c1 --쿼리문의 실행결과를 c1에 저장
is
select * from emp where deptno=20;
begin
DBMS_OUTPUT.PUT_LINE('사원번호 / 사원명 / 급여');
DBMS_OUTPUT.PUT_LINE('-------------------');
for vemp in c1 loop
exit when c1%notfound;
DBMS_OUTPUT.PUT_LINE(vemp.empno||' ::::: '||vemp.ename||' ::::: '||vemp.sal);
end loop;
END;
/
execute EMPOUTProc --만든 프로시저를 출력
select * from user_source; --프로시저가 생성되었는지 확인
show errors; --오류메시지 출력됨.
소제목 입력
매개변수는 프로시저 이름 뒤에 ( ) 를 적고, 그 안에 매개변수를 적음.
변수명과 자료형으로 적기
create or replace procedure EMPOUTProc2
(vdeptno in emp.deptno%type) --매개변수
IS
vemp emp%rowtype;
cursor c1
is
select * from emp where deptno=vdeptno;
begin
DBMS_OUTPUT.PUT_LINE('사원번호 / 사원명 / 급여');
DBMS_OUTPUT.PUT_LINE('-------------------');
for vemp in c1 loop
exit when c1%notfound;
DBMS_OUTPUT.PUT_LINE(vemp.empno||' ::::: '||vemp.ename||' ::::: '||vemp.sal);
end loop;
END;
/
execute EMPOUTProc2(30)
drop table emp01 purge --완전 삭제
create table emp01
as
select * from emp
insert into emp01
select * from emp
select * from emp01 order by deptno
commit
* in mode 매개변수 : 실행환경에서 서브 프로시저로 값을 전달함
create or replace procedure pro01_inmode
(v_deptno in emp01.deptno%type)
is
begin
update emp01 --수정
set sal = decode(v_deptno, 10, sal*1.1, 20, sal*1.2, sal)
--부서번호가 10이면 10%인상, 20이면 20% 인상 나머지는 동결
where deptno = v_deptno;
end pro01_inmode;
/
패키지
트리거
어떤 이벤트가 발생하면 그에 따라 다른 작업이 자동으로 처리됨 => 프로시저는 직접 실행 / 트리거는 자동 실행
1) 타이밍
- BEFORE : 어떤 테이블에 INSERT, UPDATE, DELETE문이 실행되기 전에. 트리거 문장 실행
- AFTER : 어떤 테이블에 INSERT, UPDATE, DELETE문이 실행되고 난 후. 트리거 문장 실행
함수
반응형