2012-08-06 5 views
0

하나의 데이터 블록 (보기 기준)이있는 표 형식 (4 개 레코드 표시)이 있습니다.오라클 양식 10g, 여러 삽입 및 업데이트가 작동하지 않습니다.

쿼리 한 후 양식에서 모든 레코드를 업데이트 할 수는 없지만 첫 번째 레코드 값만 LOV에서 선택할 수 있습니다.

필자는 온 - 인서트 및 온 - 업데이트에서 프로 시저를 호출했습니다.

쿼리는 다음과 같이이다 : 테이블이 찾아 지는가 아니면 내가 다른 트리거 또는 루프를 사용해야합니다

PACKAGE BODY MAPPING IS 

PROCEDURE INSERT_ROW(EVENT_NAME IN VARCHAR2) 
IS 
BEGIN 
IF (EVENT_NAME = 'ON-INSERT') THEN 


INSERT INTO XX_REC_MAPPING 
(BRANCH_CODE,COLLECTION_ID,PAY_MODE_ID,RECEIPT_METHOD,CREATED_BY, 
CREATION_DATE,LAST_UPDATED_BY,LAST_UPDATE_DATE,LAST_UPDATE_LOGIN) 
VALUES 
(:XX_REC_MAPPING.OFFICE_CODE, 
:XX_REC_MAPPING.COLLECTION_ID, 
:XX_REC_MAPPING.PAY_MODE_ID, 
:XX_REC_MAPPING.RECEIPT_METHOD, 
:XX_REC_MAPPING.CREATED_BY, 
:XX_REC_MAPPING.CREATION_DATE, 
:XX_REC_MAPPING.LAST_UPDATED_BY, 
:XX_REC_MAPPING.LAST_UPDATE_DATE, 
:XX_REC_MAPPING.LAST_UPDATE_LOGIN); 

ELSIF (EVENT_NAME = 'ON-UPDATE') THEN 

UPDATE XX_REC_MAPPING 
SET BRANCH_CODE=:XX_REC_MAPPING.OFFICE_CODE, 
COLLECTION_ID=:XX_REC_MAPPING.COLLECTION_ID, 
PAY_MODE_ID=:XX_REC_MAPPING.PAY_MODE_ID, 
RECEIPT_METHOD=:XX_REC_MAPPING.RECEIPT_METHOD, 
LAST_UPDATED_BY=:XX_REC_MAPPING.LAST_UPDATED_BY, 
LAST_UPDATE_DATE=:XX_REC_MAPPING.LAST_UPDATE_DATE, 
LAST_UPDATE_LOGIN=:XX_REC_MAPPING.LAST_UPDATE_LOGIN 
WHERE ROWID=:XX_REC_MAPPING.ROW_ID; 

END IF; 


END INSERT_ROW; 

END MAPPING; 

여부?

누군가 여러 업데이트를 위해이 쿼리를 편집하는 방법을 제안 해 주실 수 있습니까?

감사

sat33

+2

ON-INSERT 및 ON-UPDATE 트리거는 블록의 새로운 행이나 수정 된 행마다 자동으로 호출되므로 루프를 직접 작성할 필요가 없습니다. –

+0

내 문제는 내가 쿼리 후 양식 열의 레코드 값을 변경할 수 없습니다.그것은 동일한 값으로 남아 FRM을 보여줍니다 : 40654 레코드가 변경을보기 위해 다른 사용자 쿼리에 의해 변경되었습니다 – sat33man

답변

2

토니 맞습니다.

블록이 테이블을 기반으로하는 경우와 마찬가지로 동작합니다. 이 블록의 레코드를 편집 할 때 몇 가지 일이 발생합니다. : system.form_status는 QUERY에서 CHANGED로 변경됩니다. 변경된 각 레코드의 system.record_status는 CHANGED로 설정됩니다.

결과적으로 양식이 커밋 될 때 Oracle form은 form_status가 변경되어 일부 작업을 수행해야한다는 것을 자동으로 인식합니다. 그런 다음 레코드를 반복하면서 record_status가 변경된 각 레코드를 처리하는 블록에서 레코드를 처리하기 시작합니다.

블록이 뷰를 기반으로하므로 ON-INSERT 및 ON-UPDATE (보이는 것처럼 보일 경우)를 오버 라이딩하는 경우 문장을 잘라내어 붙여 넣기 만하면됩니다. INSERT INTO XX_REC_MAPPING ..... 을 블록 레벨의 ON-INSERT 트리거에 넣습니다. 이것은 폼이 발사 될 삽입물을 효과적으로 오버라이드시킵니다.

그리고 업데이트를 위해서도 동일한 작업을 수행해야합니다. 블록 수준에서 ON-UPDATE 트리거에 해당 문을 잘라내어 붙여 넣기 만하십시오.


FRM : 40,654 레코드 인해 형태의 잠금기구 소성에 변화를

이 오류 발생을보고 다른 사용자 다시 쿼리에 의해 변경되었다. 블록이 ROWID를 사용하여 레코드를 잠그려고합니다. 블록을 뷰에 기초한 경우 사용할 수있는 ROWID가 없습니다.

블록의 키 모드를 업데이트 할 수 없게 설정하면이 문제가 해결됩니다.

또한 JOINS 및 VIEWS의 블록을 기반으로하기 때문에 KEY MODE 속성에 대해 약간의 독해를 제안합니다.

+0

내 문제는 쿼리 한 후에 양식 열의 레코드 값을 변경할 수 없다는 것입니다. 동일한 값으로 유지되고 FRM을 보여줍니다 : 40654 변경 사항을 보려면 다른 사용자 쿼리에 의해 레코드가 변경되었습니다. – sat33man

관련 문제