|
Поддержка целостности данных с помощью xранимой процедуры
CREATE EXCEPTION
ORDER_ALREDY_SHIPPED "Order status is shipped.'?;
CREATE EXCEPTION CUSTOMER_ON_HOLD "This customer is on
hold.";
CREATE EXCEPTION CUSTOMER_CHECK "Overdue balance -- can't
ship.";
═════CREATE PROCEDURE SHIP_ORDER (PO_NUM СНAR(8))
═════AS
═════DECLARE VARIABLE ord_stat CHAR(7);
═════DECLARE VARIABLE hold_stat CHAR(l);
═════DECLARE VARIABLE cust_no INTEGER;
═════DECLARE VARIABLE any_po CHAR(8);
BEGIN
/* Сначала получим состояние заказа,
информацию о заказчике и его номер,
который будет использоваться для
проверки
далее в процедуре. Эти значения
сохраняются в
локальных переменных, определенные
выше. */
SELECT s.order_status, c.on_hold, c.cust_no
FROM sales s, customer с
WHERE po_number = :po_num
AND s.cust_no = c.cust_no
INTO :ord_stat, :hold_stat, :cust_no;
/* Проверка, был ли заказ на товары
уже выполнен. Если это так,
генерируется
исключительная ситуация и
выполнение
процедуры останавливается. */
IF (ord_stat = "shipped") THEN
BEGIN
EXCEPTION order_already_shipped;
═════SUSPEND;
END
/* Проверим, не числится ли заказчик
в должниках.
Если это так, генерируется
исключительная
ситуация и выполнение процедуры
останавливается. */
ELSE IF (hold_stat = "*") THEN
BEGIN
EXCEPTION customer_on_hold;
═════SUSPEND;
END
/* Если баланс поставленных более
чем за
2 месяца заказов отрицательный,
поместим
заказчика в список должников и
сгенерируем
исключительную ситуацию, после
чего остановим
выполнение процедуры. */
FOR SELECT po_number
FROM sales
WHERE cust_no = :cust_no
AND order_status = "shipped"
AND paid = "n"
AND ship_date < 'NOW - 60
INTO :any_po
═════DO
═════BEGIN
══════════EXCEPTION customer_check;
═════UPDATE customer
══════════SET on_hold = "*"
WHERE cust_no = :cust_no;
═════SUSPEND;
END
/* Если все проверки успешно
выполнены,
выполнятся поставка заказа. */
UPDATE sales
SET order_status = "shipped", ship_date = 'NOW'
WHERE po_number = :po_num;
SUSPEND;
END
|
|