2014-11-10 4 views
1

Oracle 12c SQL 데이터베이스의 항목 수량 (qoh)이 5 미만인 경우 SQL 트리거를 만들려고합니다. 해당 항목의 설명을 선택하고 싶습니다. 다른 테이블은 다음과 같은 쿼리와 함께 온,하지만 난 그것을 실행하려고 할 때 오류가 점점 오전 : 나는 new.item_id를 호출 할 수 있어야합니다 알아낼 수 있었던 것과트리거에서 업데이트 된 항목 사용

/*Creates a trigger to notify someone when an item is out of stock*/ 
CREATE OR REPLACE TRIGGER ItemOutOfStock 
AFTER UPDATE OF INV_QOH ON inventory 
FOR EACH ROW 
WHEN (new.INV_QOH < 5) 
BEGIN 
SELECT I.ITEM_DESC 
FROM ITEMS I 
WHERE I.ITEM_ID = new.ITEM_ID; 
END; 
/

과 작동하지만, 그렇지 않습니다. 인벤토리 테이블을 업데이트하고 dbms_output.put_line 명령을 사용하여 항목의 수량을 5 미만으로 설정하면 텍스트가 출력에 저장되므로 문제가 select 문에있는 것입니다.

+0

결과로 무엇을 하시겠습니까? 오라클 트리거는 단지 '선택'을 가질 수 없으며, 데이터는 어딘가로 가야합니다. –

+0

오. 흠. 그래서 프로 시저를 전자 메일로 보내야하므로 항목 설명을 가져 와서 저장된 send_email 프로 시저에 전달해야합니다. 그래서 저는 select 문을 사용하여 볼을 롤업 한 다음 항목 설명을 varchar2 변수에 저장하려고했습니다. – ThomYorkkke

+0

"오류가 발생했다"고 말하는 것보다는 실제 오류를 포함시키는 것이 항상 도움이됩니다. –

답변

0

SELECT 진술은 데이터와 관련이 있습니다. 잠재적으로 트리거에 선언 된 지역 변수에 데이터를 저장할 수 있습니다.

CREATE OR REPLACE TRIGGER ItemOutOfStock 
    AFTER UPDATE OF INV_QOH ON inventory 
    FOR EACH ROW 
    WHEN (new.INV_QOH < 5) 
DECLARE 
    l_item_desc item.item_desc%type; 
BEGIN 
    SELECT I.ITEM_DESC 
    INTO l_item_desc 
    FROM ITEMS I 
    WHERE I.ITEM_ID = :new.ITEM_ID; 

    <<do something with l_item_desc>> 
END; 
/

주와 같은 뭔가가 :new 의사 레코드는 대장로 시작 될 필요가있다.

트리거에서 이메일을 보내는 것이 일반적으로 바람직하지 않은 이유는 이메일 전송이 비 트랜잭션 적이기 때문입니다. 트리거가 실행될 수 있지만 트랜잭션이 롤백 될 수 있으므로 업데이트가 커밋되지 않은 경우에도 전자 메일이 전송 될 수 있습니다. 쓰기 일관성으로 인해 단일 변경 (롤백 포함)에 대해 트리거를 여러 번 실행할 수도 있습니다. 이를 정확하게 수행하려면 트리거가 전자 메일을 보내거나 (dbms_job 사용) 작업을 제출하기 위해 별도의 프로세스가 주기적으로 폴링하는 테이블에 쓰기와 같은 작업을 수행하는 것이 좋을 것입니다. 트랜잭션 커밋.