function 질문입니다. 2 681

by 약쟁이총각 [PL/SQL] [2014.02.13 18:09:59]


다음의 작업을 하는데 오류가 떠서 글을 올립니다.

1. 테이블 생성
create table id_tables (id varchar2(10) ,
 value varchar2(9) )

2. function 생성
create or replace function fc_pk_val(i_id in varchar2 )
return varchar2 is
r_val varchar2(9) := '000000001';
begin
    MERGE INTO id_tables A
    USING DUAL    
  ON ( A.id = i_id )
    WHEN MATCHED    THEN
UPDATE  SET
A.value = lpad(A.value+1 ,'9','0')   
    WHEN NOT MATCHED THEN    
INSERT ( A.id,A.value) VALUES ( i_id,r_val ) ;
    commit;   
    select value into r_val from id_tables where id = i_id;
    return r_val;
end;


------- 컴파일상 이상없음

3.function 실행
select fc_pk_val('KWON') from dual;
--- 5번과 같은 결과가 나옴

4. 원하는 결과
id_tables 테이블 내용
id    value
KOWN   000000001

5. 에러발생
ORA-14551: 질의 안에 DML 작업을 수행할 수 없습니다
ORA-06512: "FC_PK_VAL",  5행

6. 질문
   - merge 부분에서 에러가 발생하는데.. 어떻게 고쳐야 할지 모르겠네요..ㅜㅜ
여러 고수님의 손길 부탁드립니다.

by DarkBee [2014.02.13 18:23:32]
create or replace function fc_pk_val(i_id in varchar2 )
return varchar2 is
r_val varchar2(9) := '000000001';
pragma autonomous_transaction;   <= 요넘 첨부하고 Compile
begin

by 마농 [2014.02.13 18:27:01]

[질의 안에 DML 작업을 수행할 수 없습니다.]
라고 에러메시지가 아주 친절하게 설명해 주고 있네요.
함수 호출을 질의(Select) 하지 마시고 실행(Execute)하세요.
http://www.gurubee.net/lecture/1042


제 개인적인 생각으로는 함수와 프로시져를 다음과 같이 구별합니다.
함수는 조회용, 프로시져는 갱신용.
함수보다는 프로시져를 사용하는 것이 어떨까? 생각합니다.