데모#1 - 정상
SQL> create table emp (ename varchar2(20), sal number);
테이블이 생성되었습니다.
SQL> create table logt (message varchar2(100), logdt date);
테이블이 생성되었습니다.
SQL> create or replace procedure logp ( p_message varchar2 ) as
pragma autonomous_transaction;
begin
insert into logt (message, logdt)
values (p_message, sysdate);
commit;
end logp;
/ 2 3 4 5 6 7 8
프로시저가 생성되었습니다.
SQL> select * from emp;
선택된 레코드가 없습니다.
SQL> select * from logt;
선택된 레코드가 없습니다.
SQL> begin
logp('Tiger Woods : 100');
insert into emp (ename, sal) values ('Tiger Woods', 100);
logp('Tiger Woods : 100 - Rollback');
rollback;
end;
/ 2 3 4 5 6 7
PL/SQL 처리가 정상적으로 완료되었습니다.
SQL> select * from emp;
선택된 레코드가 없습니다.
SQL> select * from emp;
선택된 레코드가 없습니다.
SQL> select * from logt;
MESSAGE LOGDT
---------------------------- --------
Tiger Woods : 100 09/12/11
Tiger Woods : 100 - Rollback 09/12/11
데모#2 - 비정상
SQL> create table emp (ename varchar2(20), sal number);
테이블이 생성되었습니다.
SQL> create or replace procedure p ( p_ename varchar2 )
is
v_sal number;
begin
select sal into v_sal from emp where ename = p_ename;
dbms_output.put_line('ENAME: ' || p_ename);
dbms_output.put_line('SAL: ' || to_char(v_sal));
end;
/
2 3 4 5 6 7 8 9
프로시저가 생성되었습니다.
SQL> create or replace trigger tr
after update on emp for each row
begin
p(:new.ename);
end;
/ 2 3 4 5 6
트리거가 생성되었습니다.
SQL> set serveroutput on;
SQL> insert into emp (ename, sal) values ('tiger', 100);
1 개의 행이 만들어졌습니다.
SQL> update emp set sal = 200 where ename = 'tiger';
update emp set sal = 200 where ename = 'tiger'
*
1행에 오류:
ORA-04091: SCOTT.EMP 테이블이 변경되어 트리거/함수가 볼 수 없습니다.
ORA-06512: "SCOTT.P", 줄 5에서
ORA-06512: "SCOTT.TR", 줄 2에서
ORA-04088: 트리거 'SCOTT.TR'의 수행시 오류
SQL> create or replace procedure p ( p_ename varchar2 )
2 is
3 v_sal number;
4 pragma autonomous_transaction;
5 begin
6 select sal into v_sal from emp where ename = p_ename;
7 dbms_output.put_line('ENAME: ' || p_ename);
8 dbms_output.put_line('SAL: ' || to_char(v_sal));
9 end;
10 /
프로시저가 생성되었습니다.
SQL> select * from emp;
ENAME SAL
-------------------- ----------
tiger 100
SQL> update emp set sal = 200 where ename = 'tiger';
ENAME: tiger
SAL: 100
1 행이 갱신되었습니다.
SQL> update emp set sal = 300 where ename = 'tiger';
ENAME: tiger
SAL: 100
1 행이 갱신되었습니다.
SQL> update emp set sal = 400 where ename = 'tiger';
ENAME: tiger
SAL: 100
1 행이 갱신되었습니다.
SQL> commit;
커밋이 완료되었습니다.
SQL> select * from emp;
ENAME SAL
-------------------- ----------
tiger 400
SQL> update emp set sal = 500 where ename = 'tiger';
ENAME: tiger
SAL: 400
1 행이 갱신되었습니다.
SQL> commit;
커밋이 완료되었습니다.
- 강좌 URL : http://www.gurubee.net/lecture/3509
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.