2011-11-24 1 views
2

새 측정 (= messung) 포인트가 현재 빙하 모양 (= umriss) 내에 있는지 확인하는 트리거를 만들려고합니다.현재 날짜 쿼리/where 절을 사용하는 트리거

은 다음과 같이 테이블이다 :

빙하 형상 (= Umriss)

create table umriss 
(
umr_nr  number (4) not null, 
umr_datum date, 
GLST_ID  number (4) not null, 
shape  mdsys.sdo_geometry, 
GLETSCHER_ID number (3) not null 
) 
; 

alter table umriss 
add constraint umriss_glst_pk 
primary key (umr_nr, GLST_ID, GLETSCHER_ID) 
; 

ALTER TABLE umriss 
ADD CONSTRAINT umriss_gletscherstand_fk 
FOREIGN KEY (GLST_ID, GLETSCHER_ID) 
REFERENCES GLETSCHERSTAND(GLST_ID, GLETSCHER_ID); 

새로운 측정 (= Messung)

CREATE TABLE MESSUNG 
(
MESS_NR  number (4) not null, 
MESS_DAT  date, 
MESS_AKK  number (20) NOT NULL, 
MESS_SCHMELZ number (20) NOT NULL, 
SHAPE  mdsys.sdo_geometry, 
MESS_BILD blob, 
KMPGN_NR  NUMBER (4) NOT NULL 
); 

ALTER TABLE MESSUNG 
ADD CONSTRAINT messung_pk 
PRIMARY KEY (MESS_NR); 

ALTER TABLE MESSUNG 
ADD CONSTRAINT messung_messkampagne_fk 
FOREIGN KEY (KMPGN_NR) 
REFERENCES MESSKAMPAGNE(KMPGN_NR); 

트리거

,
CREATE OR REPLACE 
TRIGGER MESSUNG_in_UMRISS_TRI 
BEFORE INSERT OR UPDATE ON MESSUNG 
FOR EACH ROW 
DECLARE 
    num_check NUMBER; 
BEGIN 
    SELECT COUNT (*) INTO num_check 
    FROM UMRISS u 
    WHERE mdsys.sdo_contains (u.shape, :NEW.point) = 'TRUE'; 

    IF num_check <> 1 
    THEN 
     RAISE_APPLICATION_ERROR (=20500, 'Messung in keinem Umriss') 
    END IF; 
END; 

방아쇠가 가장 curretn 빙하 모양 안에 검사하는 그래서 우리는 기능을 해치는가? 도움 주셔서 감사합니다.

+0

UMRISS의 어떤 열이 "최근"을 정의합니까? – APC

+0

"umr_datum date"-> 거기에 모든 도형에 대한 날짜가 있으며 그 중 가장 최신의 것을 얻을 수 있어야합니다 ... 어떻게 든? – samjam

답변

0

이것은 테이블의 가장 최근 날짜와 일치하는 한 행 fron UMRISS를 반환합니다.

SELECT COUNT (*) INTO num_check 
FROM UMRISS u 
WHERE mdsys.sdo_contains (u.shape, :NEW.point) = 'TRUE' 
AND u.umr_datum = (select max(d.;umr_datum) from UMRISS d); 

이러한 종류의 쿼리는 현재 레코드와 동일한 테이블에 기록 데이터를 보관하는 가격입니다.

0

예를 들어 POINT가 정의되어 있지 않은 것 같습니다.

그러나, MESSUNG 레코드를 삽입하거나 업데이트 할 때 트리거에만 적용 할 것이기 때문에 당신은 점검 제한 조건을 고려할 수 있지만, 자주 UMRISS을 업데이트하는 경우 UMRISS는

alter table MESSUNG add constraint MESSUNG_CC_CONTAINS check(mdsys.sdo_contains (shape, point) = 'TRUE') 

을 변경하지 않을 때 UMRISS가 업데이트되거나 삭제 될 때 Oracle이 모든 MESSUNG 레코드를 확인해야하기 때문에 그러한 제약 조건을 적용하는 것이 타당하지 않을 수도 있습니다. 아마도 MESSUNG과 UMRISS 사이에 추가적인 매핑 테이블을 고려해 볼 수 있습니다.