데이터베이스/PLSQL
DML inside function
쌀맛나는세상
2008. 7. 15. 14:04
http://kr.forums.oracle.com/forums/thread.jspa?threadID=598160
스토어드 펑션(Stored Function)에서 DML 즉 트랜잭션 발생시 주의해야 할 부분이 있다.
스토어드 펑션의 특징상
SELECT s_fnc('') FROM DUAL;
와 같이 사용할수 있다.
하지만 다음과 같은 스토어드 펑션이 있다면
create or replace function ( p_param in varchar2 )
IS
begin
insert into aaa ( aaa ) values ( p_param);
return '';
end;
/
위의 SELECT 문의 경우 에러를 발생하게 된다.
SELECT -List 절에 스토어드 펑션을 사용할때는 DML작업이 들어가지 않게 해주어야 한다. 특히나 SELECT -List 절에 사용할 경우에는..
다만 다음과 같은 경우에는 사용 가능하나 DML작업이 들어가지 않을경우 이역시도 에러를 내뱉게 된다.
스토어드 펑션(Stored Function)에서 DML 즉 트랜잭션 발생시 주의해야 할 부분이 있다.
스토어드 펑션의 특징상
SELECT s_fnc('') FROM DUAL;
와 같이 사용할수 있다.
하지만 다음과 같은 스토어드 펑션이 있다면
create or replace function ( p_param in varchar2 )
IS
begin
insert into aaa ( aaa ) values ( p_param);
return '';
end;
/
위의 SELECT 문의 경우 에러를 발생하게 된다.
SELECT -List 절에 스토어드 펑션을 사용할때는 DML작업이 들어가지 않게 해주어야 한다. 특히나 SELECT -List 절에 사용할 경우에는..
다만 다음과 같은 경우에는 사용 가능하나 DML작업이 들어가지 않을경우 이역시도 에러를 내뱉게 된다.
1 create or replace function add_n(a NUMBER,b NUMBER) RETURN NUMBER IS
2 PRAGMA AUTONOMOUS_TRANSACTION;
3 BEGIn
4 INSERT INTO ty values(a + b);
5 COMMIT;
6 RETURN (a+b);
7* END;
SQL> /
Function created.
SQL> select add_n(10,20) from dual;
ADD_N(10,20)
------------
30
SQL> select * from ty;
A
---------
30
SQL>
2 PRAGMA AUTONOMOUS_TRANSACTION;
3 BEGIn
4 INSERT INTO ty values(a + b);
5 COMMIT;
6 RETURN (a+b);
7* END;
SQL> /
Function created.
SQL> select add_n(10,20) from dual;
ADD_N(10,20)
------------
30
SQL> select * from ty;
A
---------
30
SQL>