2011-11-12 51 views
0

因此對於我的大學課程,我必須爲航空公司創建一個Oracle數據庫。 (這是我第一次和oracle一起工作)查看兩個日期是否相距超過6個月Oracle

我的要求的一部分是確定飛行員是否適合飛行。要做到這一點,我的員工和pilot_test表設置如下:每當一個新的飛行被添加到系統

CREATE TABLE PILOT_TEST (
    TEST_ID NUMBER(11) PRIMARY KEY, 
    TEST_DATE DATE NOT NULL, 
    EMPLOYEE_ID NUMBER(11) NOT NULL 
); 

CREATE TABLE EMPLOYEE (
    EMPLOYEE_ID NUMBER(5) PRIMARY KEY, 
    FIRST_NAME VARCHAR2(15) NOT NULL, 
    LAST_NAME VARCHAR2(20) NOT NULL, 
    MIDDLE_NAME VARCHAR2(15) NULL, 
    POSITION VARCHAR2(13) NOT NULL, /* pilot, booking clerk, maintenance staff*/ 
    EMPLOYED_FROM DATE NOT NULL, 
    EMPLOYED_TO DATE NOT NULL, 
    TELEPHONE NUMBER(11) NOT NULL, 
    EMAIL VARCHAR2(40) NULL, 
    ADDRESS_LINE1 VARCHAR2(20) NOT NULL, 
    ADDRESS_LINE2 VARCHAR2(20) NULL, 
    TOWN VARCHAR2(20) NOT NULL, 
    POST_CODE VARCHAR2(9) NOT NULL, 
    SALARY NUMBER(6,2) NOT NULL, 
    STATUS VARCHAR2(16) NOT NULL /*working, on leave, contract expired, fired*/ 
); 

,我使用觸發器來檢查分配給駕駛飛機的工作人員是否實際上是一個試點。 進入這個觸發器我想檢查一下,如果他是一名飛行員,那麼他的最後TEST_DATE是否不到6個月大。關於如何做到這一點的任何想法?

我當前觸發看起來像這樣

CREATE OR REPLACE TRIGGER CHECK_PILOT_ALLOCATION 
BEFORE INSERT ON FLIGHT 
FOR EACH ROW 
DECLARE 
    TEMP_POSITION VARCHAR2(13); 
BEGIN 

SELECT POSITION INTO TEMP_POSITION 
FROM EMPLOYEE 
WHERE EMPLOYEE_ID = :NEW.PILOT_ID; 

IF UPPER (TEMP_POSITION) <> 'PILOT' THEN 
RAISE_APPLICATION_ERROR (-20001, 'Assigned employee is not a pilot'); 

ELSIF 
END IF; 
END; 
/

回答

2

嘗試

DECLARE 
    TEMP_POSITION VARCHAR2(13); 
    TEMP_TESTDATE DATE; 
BEGIN 

SELECT E.POSITION, 
     (SELECT MAX (TEST_DATE) 
      FROM PILOT_TEST PT 
     WHERE PT.TEST_DATE <= SYSDATE 
      AND PT.EMPLOYEE_ID = E.EMPLOYEE_ID) TEST_DATE 
    INTO TEMP_POSITION, 
     TEMP_TESTDATE 
    FROM EMPLOYEE E 
WHERE E.EMPLOYEE_ID = :NEW.PILOT_ID; 

IF UPPER (TEMP_POSITION) <> 'PILOT' 
THEN 
    RAISE_APPLICATION_ERROR (-20001, 'Assigned employee is not a pilot'); 
END IF; 

IF (SYSDATE - TEMP_TESTDATE) > 182 
THEN 
    RAISE_APPLICATION_ERROR (-20001, 'Assigned pilot has not been tested in the last 6 months'); 
END IF; 

END; 
+1

這裏的教育部分:Oracle允許您通過從日期中添加和減去整數來執行基於日期的數據運算,並在您從另一個日期中減去日期時返回日期。 – WCRC

2

我只是外部聯接兩個表一起,檢查它們是否是一個試點。檢查證書日期可以用case語句來完成。請注意內置的ADD_MONTHS函數的存在以爲您執行日期算術。我喜歡在select語句中儘可能地做到這一點。最後,我會檢查員工的存在以及異常處理程序。一般來說,你應該總是有你的SQL的異常處理程序。我見過太多的情況,有人認爲自從應該在那裏他們沒有處理例外,當然它最終確實發生。那時你會以非常規的方式讓Oracle產生異常。

BEGIN 

    SELECT e.employee_id, NVL(UPPER(e.position),'xx') 
     , CASE WHEN ADD_MONTHS(MAX(test_date), 6) > SYSDATE THEN 1 ELSE 0 END date_ck 
    INTO v_id, v_pos, v_date_ck 
    FROM employee e LEFT JOIN pilot_test p ON e.employee_id = p.employee_id 
    WHERE e.employee_id = :new.pilot_id 
    GROUP BY e.employee_id, NVL(UPPER(e.position),'xx'); 

    IF v_pos <> 'PILOT' THEN 
    RAISE_APPLICATION_ERROR (-20001, 'Not a pilot'); 
    ELSIF v_date_ck = 0 THEN 
    RAISE_APPLICATION_ERROR (-20002, 'Not recently tested'); 
    END IF; 

EXCEPTION 
    WHEN OTHERS THEN 
    RAISE_APPLICATION_ERROR (-20003, 'Not an employee'); 
END; 
相關問題