wiki:DatabaseProgramming

Version 3 (modified by 231027, 2 days ago) ( diff )

--

Програмирање на базата на податоци

Функции

fn_calculate_price

Оваа функција ја пресметува крајната цена на билетот во реално време преку проверка на сите активни периоди за попуст или поскапување. Таа овозможува системот да биде флексибилен со цените без да се менуваат оригиналните записи во табелата со билети.

CREATE OR REPLACE FUNCTION fn_calculate_price(p_ticket_id BIGINT) RETURNS FLOAT4 AS $$
DECLARE v_base FLOAT4; v_perc INT; v_inc BOOLEAN;
BEGIN
    SELECT base_price INTO v_base FROM "Ticket" WHERE ticket_id = p_ticket_id;
    SELECT price_change_percent, increase_decrease INTO v_perc, v_inc FROM "Event_Period" 
    WHERE event_happening_id = (SELECT event_happening_id FROM "Ticket" WHERE ticket_id = p_ticket_id)
    AND CURRENT_DATE BETWEEN start_date AND end_date LIMIT 1;
    IF v_perc IS NOT NULL THEN
        IF v_inc THEN v_base := v_base + (v_base * v_perc / 100.0);
        ELSE v_base := v_base - (v_base * v_perc / 100.0); END IF;
    END IF;
    RETURN v_base;
END; $$ LANGUAGE plpgsql;

fn_check_resource_availability

Оваа функција служи како централен систем за детекција на конфликти помеѓу термините на настаните. Проверува дали одредена локација или изведувач се веќе зафатени во бараниот временски интервал, спречувајќи дуплирање на резервациите.

CREATE OR REPLACE FUNCTION fn_check_resource_availability(p_type TEXT, p_id BIGINT, p_start TIMESTAMP, p_dur INT) RETURNS BOOLEAN AS $$
BEGIN
    IF p_type = 'VENUE' THEN
        RETURN NOT EXISTS (SELECT 1 FROM "Event_Happening" WHERE venue_id = p_id AND (p_start, (p_start + (p_dur || ' minutes')::interval)) OVERLAPS (event_time, (event_time + (duration || ' minutes')::interval)));
    ELSIF p_type = 'PERFORMER' THEN
        RETURN NOT EXISTS (SELECT 1 FROM "Event_Happening_Performer" ehp JOIN "Event_Happening" eh ON ehp.event_happening_id = eh.event_happening_id 
        WHERE ehp.performer_id = p_id AND (p_start, (p_start + (p_dur || ' minutes')::interval)) OVERLAPS (eh.event_time, (eh.event_time + (eh.duration || ' minutes')::interval)));
    END IF;
    RETURN TRUE;
END; $$ LANGUAGE plpgsql;

fn_validate_hierarchy_capacity

Оваа функција врши строга контрола врз хиерархиската структура на објектот (Venue -> Section -> Seat). Гарантира дека вкупниот број на седишта во секциите не ја надминува границата на салата, ниту пак бројот на реални седишта го надминува капацитетот на секцијата.

CREATE OR REPLACE FUNCTION fn_validate_hierarchy_capacity(p_parent_id BIGINT, p_new_amount INT, p_type TEXT) RETURNS BOOLEAN AS $$
DECLARE v_limit INT; v_current INT;
BEGIN
    IF p_type = 'VENUE_LIMIT' THEN
        SELECT number_of_seats INTO v_limit FROM "Venue" WHERE venue_id = p_parent_id;
        SELECT COALESCE(SUM(number_of_seats), 0) INTO v_current FROM "Section" WHERE venue_id = p_parent_id;
    ELSIF p_type = 'SECTION_LIMIT' THEN
        SELECT number_of_seats INTO v_limit FROM "Section" WHERE section_id = p_parent_id;
        SELECT COUNT(*) INTO v_current FROM "Seat" WHERE section_id = p_parent_id;
    END IF;
    RETURN (v_current + p_new_amount) <= v_limit;
END; $$ LANGUAGE plpgsql;

Процедури

Тригери

Note: See TracWiki for help on using the wiki.