Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --7.2 Написать функцию, которая для заданного моряка возвращает среднюю длительность пребывания в море в днях. Значение может рассчитываться за конкретный сезон и/или для катера. Принадлежность выхода в море сезону определяется по дате начала, если катер еще не вернулся, то учитявается кол-во дней , прошедших с его выхода в море. Функция имеет 3 аргумента: id_моряка, сезон(1-4) и id_катера. Только первый аргумент является обязательным. Предусмотреть вариант вызова функции без необязательных аргументов.
- CREATE OR REPLACE FUNCTION F_DAY(MORYAKK IN NUMBER, SEZON IN NUMBER DEFAULT NULL, KATERR IN NUMBER DEFAULT NULL)
- RETURN NUMBER
- AS
- DAY_COUNT NUMBER(10,0);
- AVERAGE NUMBER;
- MORYAKK_CHECK NUMBER(10, 0);
- KATERR_CHECK NUMBER(10, 0);
- INVALID_MORYAKK EXCEPTION;
- KOL_PLAVANIY NUMBER(10, 0);
- BEGIN
- IF MORYAKK IS NULL THEN
- RAISE INVALID_MORYAKK;
- END IF;
- SELECT COUNT(MORYAK_ID) INTO MORYAKK_CHECK FROM MORYAKI WHERE MORYAK_ID=MORYAKK;
- IF MORYAKK_CHECK = 0 THEN
- RAISE INVALID_MORYAKK;
- END IF;
- IF SEZON IS NOT NULL AND SEZON NOT IN (1, 2, 3, 4) THEN
- DBMS_OUTPUT.PUT_LINE('Неверный сезон');
- RETURN 0;
- END IF;
- SELECT COUNT(KATER_ID) INTO KATERR_CHECK FROM KATERA WHERE KATER_ID = KATERR;
- IF KATERR_CHECK = 0 AND KATERR IS NOT NULL THEN
- DBMS_OUTPUT.PUT_LINE('Неверный идентификатор катера');
- RETURN 0;
- END IF;
- SELECT AVG(VOZRAT_DATE-VIHOD_DATE), COUNT(*) INTO AVERAGE, KOL_PLAVANIY FROM VMORE
- INNER JOIN KATERA ON KATERA.KATER_ID=VMORE.KATER_ID
- INNER JOIN MORYAKI ON MORYAKI.KATER_ID=KATERA.KATER_ID AND MORYAKI.moryak_id=MORYAKK
- WHERE (SEZON IS NULL OR MOD(EXTRACT(MONTH FROM VIHOD_DATE)+1, 12) IN (SEZON*3-2, SEZON*3-1, SEZON*3))
- AND (KATERR_CHECK = 0 OR KATERA.KATER_ID=KATERR);
- IF KOL_PLAVANIY > 0 THEN
- RETURN AVERAGE;
- ELSE
- RETURN 0;
- END IF;
- EXCEPTION
- WHEN INVALID_MORYAKK THEN
- DBMS_OUTPUT.PUT_LINE('Моряк не задан');
- RETURN 0;
- END F_DAY;
- /
- DECLARE
- NAM MORYAKI.FIO%TYPE;
- MOR_COUNT NUMBER;
- BEGIN
- SELECT FIO INTO NAM FROM MORYAKI WHERE MORYAK_ID = 1; --ДЛЯ ПРОВЕРКИ
- MOR_COUNT := F_DAY(1);
- DBMS_OUTPUT.PUT_LINE('Для моряка ' || NAM || ' средняя длительность пребывания в море ' || MOR_COUNT || '.');
- MOR_COUNT := F_DAY(1, 4, 1);
- DBMS_OUTPUT.PUT_LINE('Для моряка ' || NAM || ' в сезоне '|| 4 || ' на катере '|| 1 || ' средняя длительность пребывания в море ' || MOR_COUNT || '.');
- END;
- /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement