Найдите, если две даты более чем на 6 месяцев с Oracle - PullRequest
0 голосов
/ 12 ноября 2011

так что для моей университетской курсовой работы я должен создать базу данных оракула для авиакомпании.(я впервые работаю с оракулом)

часть моего требования - определить, пригодны ли пилоты для полета.для этого мои таблицы employee и 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 ]

2 голосов
/ 12 ноября 2011

Я бы просто соединил две таблицы вместе и проверил, являются ли они пилотом.Проверка даты сертификата может быть сделана с заявлением по делу.Обратите внимание на существование встроенной функции 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;
2 голосов
/ 12 ноября 2011

1001 * попробовать *

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...