о
Бновления
NORM может работать с любыми операциями манипулирования данными,
то есть
INSERT
,
UPDATE
и
DELETE
, которые все вместе называются запросами на
обновление.
Запрос на обновление отправляется из приложения в виде сложного объ-
екта и на уровне базы данных может привести к нескольким операциям
обновления, применяемым к разным таблицам.
И снова разработка базы данных управляется контрактом. Функция базы
данных получает объект JSON из приложения, разбирает его и интерпрети-
рует действия, которые требуются на уровне базы данных.
Вставка
Поскольку посадочный талон никогда не выдается в момент создания брони-
рования, функция, которая вставляет сегмент бронирования в базу данных,
очень проста и вставляет строку только в одну таблицу, см. лис тинг 13.8.
Обновление
Для сегмента бронирования допустим лишь ограниченный набор обновлений,
хоть он и представлен сложным объектом. В тех случаях, когда переброниро-
вание разрешено, можно изменить номер рейса в сегменте бронирования, но
нельзя менять сам рейс – для этого предусмотрены другие функции. Кроме
Обновления
255
того, посадочные талоны всегда выдаются отдельно. Таким образом, в этом
случае обновление ограничивается изменением номера рейса, выдачей по-
садочного талона или его удалением (обновить посадочный талон нельзя).
Чтобы объем кода оставался в пределах разумного, в лис тинге 13.9 пока-
зана функция обновления с ограниченной функциональностью.
Листинг 13.8
Функция
booking_leg_insert
CREATE OR REPLACE FUNCTION booking_leg_insert (p_object json)
RETURNS SETOF text
AS $body$
DECLARE
v_result booking_leg_record[];
v_sql text;
v_rec record;
v_booking_id int;
v_flight_id int;
v_leg_num int;
v_is_returning boolean;
v_booking_leg_id int;
BEGIN
FOR v_rec IN (SELECT * FROM json_each_text(p_object))
LOOP
CASE
WHEN v_rec.key = 'booking_id' THEN
v_booking_id := v_rec.value;
WHEN v_rec.key = 'flight_id' THEN
v_flight_id := v_rec.value;
WHEN v_rec.key = 'leg_num' THEN
v_leg_num := v_rec.value;
WHEN v_rec.key = 'is_returning' THEN
v_is_returning := v_rec.value;
ELSE
NULL;
END CASE;
END LOOP;
INSERT INTO booking_leg (
booking_id, flight_id, leg_num, is_returning, update_ts
) VALUES (
v_booking_id, v_flight_id, v_leg_num, v_is_returning, now()
)
RETURNING booking_leg_id INTO v_booking_leg_id;
RETURN QUERY (
SELECT * FROM array_transport(booking_leg_select_json(v_booking_leg_id))
);
END;
$body$
LANGUAGE plpgsql;
Do'stlaringiz bilan baham: |