2012-10-31 4 views
2

다음 프로 시저가 내장 프로 시저에 있습니다. 프로 시저가 삽입 트리거에서 호출됩니다.Oracle 절차 : 동시성 및 CLOB 변수

v_ProdName VARCHAR2(250); 
v_ID VARCHAR2(50); 
v_Clob CLOB; 
-- .... 
SELECT  
    MY_TABLE.ID, 
    MY_TABLE.PRODNAME, 
    MY_TABLE.MY_CLOB 
    INTO 
    v_ID, 
    v_ProdName, 
    v_Clob 
    FROM 
-- ... 

이 세 변수는 함수 호출에 사용되며 그 함수 (타사)는 새 레코드를 삽입합니다.

이것은 작동합니다. 그러나 위의 CLOB 삽입에 문제가 있습니다. 여러 행이 서로간에 빠르게 삽입되는 경우 (예 : sql 개발자가 "insert"메서드 또는 WebMethod를 사용하여 csv에서 가져 오기, 동일한 트랜잭션에서 삽입이 발생한다고 가정) CLOB는 모든 행에 대해 첫 번째 삽입 된 행의 값을가집니다. .. (예 : 아이디, ProdName가)

를 올바른 값이 따라서이 Clob가 어떻게 든 캐시 보인다 그게 사실 나는 그 문제를 해결할 수있는 방법

편집 :?

예 :

DECLARE 

-- ... variables 
    v_id varchar2(15); 

BEGIN 

-- assign values to vars, one of them is an ID on which CLOB is selected 
    -- in the procedure 
    v_id := '754-56-4'; 

my_procedure(v_id, args); 

    -- if this commit in un-commented, it works as expected. 
    -- eg. the 2 inserted rows have different values for the clob field 
-- COMMIT; 


-- assign other values to vars especially different id 
    -- -> result should have a different value in CLOB field   
    v_id := '5356-97-6'; 

my_procedure(v_id, args); 

END; 

다른 모든 COMMIT가 만들어 졌는지 여부와 관계없이 v_id를 기반으로 선택된 필드는 올바른 값을 갖습니다! 그래서 프로 시저가 아닌 CLOB의 문제입니다 !!!

+0

왜 INSERT 트리거에서 SELECT를 수행해야합니까? 삽입 된 데이터를 직접 참조 할 수 없습니까? –

+0

Nope. 트리거는 추가 정보가 조회되는 "id"만 얻습니다 (SELECT). 트리거가 실행되는 테이블은 WebMethod (예 : 메시징)로 채워지고 트리거에서 호출 된 프로 시저가 데이터 + 추가 데이터를 조회에서 최종 대상으로 이동합니다. 수신 된 모든 행이 전송되는 것은 아닙니다. 어쨌든 이것은이 문제와 관련이 없습니다. –

+0

.csv Import/WebMethod를 통하는 대신 INSERT 문을 사용하여 직접 테스트 할 수 있습니까? –

답변

0

이 문제는 타사 기능의 버그로 인해 발생했습니다.