2017-12-24 2 views
0

다른 엔티티에서 열 값을 설정합니다오라클 SQL 트리거 내가 다른 기업에서 <code>get_out</code> 및 <code>get_in</code> 곱한 가격 값 사이의 차이와 비용 열을 업데이트 할 테이블라고 지불에 대한 업데이 트 트리거를 만들

나는 트리거를 만드는 많은 경험이 없지만 지금까지 내가 방아쇠 만들 때

CREATE OR REPLACE TRIGGER o1 BEFORE UPDATE OF get_out ON payment 
FOR EACH ROW 

BEGIN        
    UPDATE payment 
    SET payment.cost = ROUND (24 * (to_date(payment.get_out)-to_date(payment.get_in)),0) * 
     (SELECT price FROM payment,book,place    
      WHERE book.ID_place = place.ID_place 
       AND payment.ID_payment = book.ID_payment 
       AND payment.ID_payment = :NEW.payment.ID_payment 
     ) 
     ; 
END; 
/

나는이 오류가있어 무엇 :

컴파일 오류로 인해 트리거가 생성되었습니다.

LINE/COL ERROR 
---------- ----------------------------------------------------------- 
7/43  PLS-00049: bad bind variable 'NEW.PAYMENT' 

어떤 제안 ? 감사합니다

+0

': NEW.payment.ID_payment' 대신': NEW.ID_Payment'를 사용하십시오. 행운을 빌어 요. –

+0

누군가가 단일 행의 get_out을 수정할 때마다 전체 테이블을 업데이트하겠습니까? 수정할 행의 비용 만 업데이트하려면 new.cost를 케이블로 설정하면됩니다. 트리거에서 UPDATE 문을 실행하지 마십시오. 여기에 드래곤이 있습니다. –

+0

'to_date (payment.get_out) -to_date (payment.get_in)'은'trunc (payment.get_out) -trunc (payment.get_in)'이되어야합니다. 즉 경과 시간 며칠? 'get_in'과'get_out'이 벌써 데이트 인 경우에, to_date를 사용하면 올바르게 할 수 없습니다. –

답변

0

update 테이블 payment을 (를) update trigger (으)로 보내려고합니다. 조인의 반환 값을 열 :new.cost에 할당하면됩니다.

은 더 이상 사용되지 않는 이전 구문 대신 JOIN ON 구문을 사용하고 테이블 순서 구문의 첫 번째 테이블로 book을 사용하는 것이 좋습니다.

:new.payment.ID_payment에 대한 부주의 한 시도가 있습니다. 대신 :new.ID_payment이어야합니다. 열 get_outget_in 유형 date의, 그리고 단지 (대신 24.12.2017 08:00의, 24.12.2017) date and time info없이 date value를 유지하면 그런데

CREATE OR REPLACE TRIGGER o1 BEFORE UPDATE OF get_out ON payment 
FOR EACH ROW 

BEGIN        
    :new.cost := round(24 * (to_date(:new.get_out)-to_date(:new.get_in)),0) * 
     (select price 
      from book b 
      join payment py on py.id_payment = b.id_payment 
      join place pl on pl.id_place = b.id_place    
      where py.id_payment = :new.id_payment   ); 
END; 
/

은, 다음 필요는 빼기에 TO_DATE를 사용하여 주조 없습니다.

+0

@Barbaros에 감사드립니다. 귀하의 코드를 사용해 보았지만 여전히 컴파일 오류로 생성 된 트리거라고합니다. 예, get_out 및 get_in 유형은 날짜이지만 시간을 사용할 수 있도록 nls_date_format을 설정했습니다. – Hilfit19

+0

@ Hilfit19 –

관련 문제