Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 2.93 KB | None | 0 0
  1. CREATE OR REPLACE TRIGGER hunter_select
  2.         BEFORE INSERT ON Contract
  3.         FOR EACH ROW
  4. DECLARE
  5.         cost NUMBER;
  6.         d_line DATE;
  7.         prepay NUMBER;
  8.         diff NUMBER;
  9.         skilled_hunters NUMBER;
  10.         cond_id NUMBER;
  11.         armed_hunters NUMBER;
  12.         live_hunters NUMBER;
  13.         free_hunters NUMBER;
  14.         no_money_err EXCEPTION;
  15.         death_hunter EXCEPTION;
  16.         working_hunter EXCEPTION;
  17.         unarmed_hunter EXCEPTION;
  18.         unskilled_hunter EXCEPTION;
  19.         too_late EXCEPTION;
  20. BEGIN
  21.         SELECT SUM(base_cost) INTO cost FROM task_base
  22.                 WHERE id IN (SELECT task_id FROM tasks_of_orders
  23.                         WHERE order_id = :NEW.order_id);
  24.         SELECT deadline INTO d_line FROM "Order"
  25.                 WHERE id = :NEW.order_id;
  26.         SELECT prepayment INTO prepay FROM "Order"
  27.                 WHERE id = :NEW.order_id;
  28.         --prepayment
  29.         SELECT difficulty INTO diff FROM "Order"
  30.                 WHERE id = :NEW.order_id;
  31.         --difficulty
  32.         SELECT MAX(conditions_id) INTO cond_id FROM tasks_of_orders
  33.                 WHERE order_id  = :NEW.order_id;
  34.         --conditions
  35.         SELECT COUNT(id) INTO live_hunters FROM hunters
  36.                 WHERE status = 'жив' AND id = :NEW.hunter_id;
  37.         --0?exc:ok;
  38.         SELECT COUNT(hunter_id) INTO free_hunters FROM contract
  39.                 WHERE id = :NEW.hunter_id AND status = 'выполняется';
  40.         --!0?exc:ok
  41.         SELECT COUNT(hunter_id) INTO skilled_hunters FROM ratings
  42.                 WHERE conditions_id = cond_id AND hunter_id = :NEW.hunter_id
  43.                 AND rating > diff;
  44.          --rating>difficulty?ok:exc
  45.          SELECT COUNT(hunter_id) INTO armed_hunters FROM hunter_equipment
  46.                 WHERE hunter_id = :NEW.hunter_id
  47.                 AND equipment_id IN (SELECT id FROM equipment
  48.                                         WHERE conditions_id = cond_id);
  49.         --_armed_hunters>0?ok:exc
  50.         IF d_line < SYSDATE THEN RAISE too_late; END IF;
  51.         IF prepay = 0 THEN RAISE no_money_err; END IF;
  52.         IF live_hunters = 0 THEN RAISE death_hunter; END IF;
  53.         IF free_hunters = 0 THEN RAISE working_hunter; END IF;
  54.         IF skilled_hunters = 0 THEN RAISE unskilled_hunter; END IF;
  55.         IF armed_hunters = 0 THEN RAISE unarmed_hunter; END IF;
  56.         :NEW.final_cost := cost*diff;
  57.         SELECT Contract_seq.NEXTVAL INTO :NEW.id FROM dual;
  58. EXCEPTION
  59.         WHEN unarmed_hunter THEN RAISE_APPLICATION_ERROR(-20571,'Naked!');
  60.         WHEN working_hunter THEN RAISE_APPLICATION_ERROR(-20569,'Busy');
  61.         WHEN death_hunter THEN RAISE_APPLICATION_ERROR(-20568,'(S)He_s dead');
  62.         WHEN too_late THEN RAISE_APPLICATION_ERROR(-20567,'Too late!');
  63.         WHEN no_money_err THEN RAISE_APPLICATION_ERROR(-20566,'No money!');
  64.         WHEN unskilled_hunter THEN RAISE_APPLICATION_ERROR(-20570,'Unskilled');
  65. END hunter_select;
  66. /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement