function 질문입니다. 1 2 2,352

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


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

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입