INSERT/SELECT시 사용자 함수(FUNCTION)시 0이 적재됨... 0 6 1,030

by LKJ [Oracle 기초] #FUNCTION #사용자함수 [2022.07.21 16:32:21]


하기 SELECT를 수행시 아래와 같이 결과가 나옵니다.
이때 C 컬럼은 사용자함수로 시간이 좀 걸리는 FUCTION 입니다.

SELECT A
     , B
     , SFFA_FUNCTION('202206', '5555') C  -- USER DEFINCED FUCTION
  FROM HIHIHI

<결과>

------------
A     B     C  
------------
20 30  40

 

그리고 위 SELECT를 INSERT 하여 저장시 후 "HAHAHA" 테이블을 조회하면 C 필드에 0이 들어갑니다.
INSERT 처리하기 전에 C의 사용자 함수가 속도가 오래 걸리니 값을 반환하지 못해서 나오는 증상일까요?
물론 FUNCTION을 호출하지 않고 FUNCTION안의 쿼리를 가져와서 처리하면 정상적으로 40은 INSERT 됩니다.

이런경우 어떻게 조치하면 될까요?!


INSERT INTO HAHAHA

    A 
  , B
  , C
)
SELECT A
     , B
     , SFFA_FUNCTION('202206', '5555') C  -- USER DEFINCED FUCTION
  FROM HIHIHI

<결과>

------------
A     B     C  
------------
20 30  0

by LKJ [2022.07.21 16:37:12]

JAVASCRIPT처럼 FUNCTION의 RETURN이 올때까지 기다려 주지 않고 비동기 식으로 INSERT가 되어 버려서 발생하는 증싱인 걸까요?!

이렇게 처리하는 쿼리가 너무 많은데 잘 이해가 되지 않습니다. ㅠㅠ


by 신이만든지기 [2022.07.21 17:12:21]

오라클 쿼리에 비동기 처리가 있다는 것은 처음 들어봤는데요.

SFFA_FUNCTION('202206', '5555') <-- 여기에 들어가는 파라미터는 상수(고정된 값)인가요?

그렇다면 한번만 실행하도록 해보세요.

SELECT A, B, C
    FROM HIHIHI,
        (SELECT SFFA_FUNCTION('202206', '5555') C FROM DUAL) TB1

위 함수 실행시점에 0값이 리턴되는 것으로 생각됩니다.

 


by LKJ [2022.07.21 17:55:51]

답변 감사합니다!!! 


by 마농 [2022.07.21 17:24:40]

펑션 내부에 대상 테이블을 참조하는 부분이 포함되어 있을 듯 합니다.
이 경우 펑션 사용이 SELECT 에서는 문제가 없지만, DML 에서의 사용은 오류가 나게 됩니다. (ORA-04091 mutating)
오류가 나지 않고 0 을 리턴하는 것은.
아마 펑션 안에서 Exception 처리로 0 을 리턴하는게 아닐까? 생각됩니다.


by LKJ [2022.07.21 17:55:29]

마농님 생각이 맞으시네요. 

전 비동기 식으로 INSERT 하기전에 FUNCTION 값이 RETURN 받지 못해서 그런거라 생각했는데.

말씀하신대로 펑션 내부에서 적재하려는 대상 테이블을 참조하고 있었네요. 

답변 감사합니다.


by LKJ [2022.07.21 18:04:07]

이렇게 사용하는 펑션들 다 찾아서 수정 해야겠네요. ㅠ

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