2011-03-02 5 views
1

테이블 이후에 실행되는 Oracle 트리거를 만들려고하면 어떤 방식 으로든 업데이트됩니다. 나는이 모든 아침 인터넷 검색이 함께했다 봤는데 :삽입, 삭제 또는 업데이트시 Oracle 트리거

CREATE OR REPLACE TRIGGER gb_qty_change 
AFTER UPDATE OR INSERT OR DELETE ON F_ITEM_STORE 
FOR EACH ROW 
DECLARE 
    v_qty V_AD_ON_HAND%rowtype; 
    v_isbn TD_ITEM_DESCRIPTION.TD_IDENTIFIER%type; 
BEGIN 
    delete from gb_transaction where gb_tide = :new.ITST_ITEM_TIDE_CODE; 
    select TD_IDENTIFIER INTO v_isbn from TD_ITEM_DESCRIPTION where TD_TIDE = :new.ITST_ITEM_TIDE_CODE; 
    select * INTO v_qty from V_AD_ON_HAND where ITST_ITEM_TIDE_CODE = :new.ITST_ITEM_TIDE_CODE; 
    insert into gb_transaction(gb_tide, gb_isbn, gb_used_on_hand, gb_new_on_hand) 
     values(:new.ITST_ITEM_TIDE_CODE, v_isbn, v_qty.USED_ON_HAND, v_qty.NEW_ON_HAND); 
END; 
/

내가 새 테이블에 TIDE_CODE 당 하나의 레코드로 유지하기 위해 노력하고있어.

V_AD_ON_HAND는 인벤토리 수를 가져 오는보기입니다. gb_transaction이이 이벤트를 로깅하고있는 새 테이블입니다.

다른 사람 코드와 비교하면 실행해야하지만 "경고 : 트리거가 컴파일 오류로 생성되었습니다."라는 메시지가 나타납니다.

+2

트리거 (또는 다른 PL/SQL 블록)에 컴파일 오류가 있다는 경고 메시지가 나타나면 SQL 프롬프트에서 "SHOW ERRORS"를 입력하여 컴파일 목록을 가져올 수 있습니다 오류. 그러면 특정 오류를 식별하는 데 도움이됩니다. –

답변

3

문제는, 내가 생각하기에 : 삭제 트리거에 대한 새로운 지정입니다. 레코드가 삭제되면 결국 NEW 값이 없습니다. 삭제시에만 : OLD 값에 액세스 할 수 있습니다.

작업별로 트리거를 섹션 화하면 이렇게 할 수 있습니다.

덧붙여 말하자면 오류가 무엇인지 알려주는 것이 일반적으로 도움이됩니다. SQL * Plus 스크립트를 통해 컴파일하는 경우 슬래시 호출 후 "end;"다음에 트리거를 컴파일하십시오. 명령문에 다음 줄을 추가하십시오.

SHOW ERRORS TRIGGER YOUR_TRIGGER_NAME;

+0

"select * from user_errors"를 실행할 수도 있습니다. 여기서 name = 'GB_QTY_CHANGE'; " 오류 (또는 그 모든 오류)를 얻으려면 – Harrison

+0

두 가지 대답을 통해 문제를 디버그하는 데 도움이되었습니다. 새로운 가치도 역시 문제가되었습니다. 고마워요! – tylerjohnst

관련 문제