Advertisement
meta1211

Untitled

Dec 24th, 2019
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MySQL 2.96 KB | None | 0 0
  1. --7.2 Написать функцию, которая для заданного моряка возвращает среднюю длительность пребывания в море в днях. Значение может рассчитываться за конкретный сезон и/или для катера. Принадлежность выхода в море сезону определяется по дате начала, если катер еще не вернулся, то учитявается кол-во дней , прошедших с его выхода в море. Функция имеет 3 аргумента: id_моряка, сезон(1-4) и id_катера. Только первый аргумент является обязательным. Предусмотреть вариант вызова функции без необязательных аргументов.
  2.  
  3. CREATE OR REPLACE FUNCTION F_DAY(MORYAKK IN NUMBER, SEZON IN NUMBER DEFAULT NULL, KATERR IN NUMBER DEFAULT NULL)
  4. RETURN NUMBER
  5. AS
  6. DAY_COUNT NUMBER(10,0);
  7. AVERAGE NUMBER;
  8. MORYAKK_CHECK NUMBER(10, 0);
  9. KATERR_CHECK NUMBER(10, 0);
  10. INVALID_MORYAKK EXCEPTION;
  11. KOL_PLAVANIY NUMBER(10, 0);
  12. BEGIN
  13.     IF MORYAKK IS NULL  THEN
  14.         RAISE INVALID_MORYAKK;
  15.     END IF;
  16.     SELECT COUNT(MORYAK_ID) INTO MORYAKK_CHECK FROM MORYAKI WHERE MORYAK_ID=MORYAKK;
  17.     IF MORYAKK_CHECK = 0 THEN
  18.         RAISE INVALID_MORYAKK;
  19.     END IF;
  20.     IF SEZON IS NOT NULL AND SEZON NOT IN (1, 2, 3, 4) THEN
  21.         DBMS_OUTPUT.PUT_LINE('Неверный сезон');
  22.         RETURN 0;
  23.     END IF;
  24.     SELECT COUNT(KATER_ID) INTO KATERR_CHECK FROM KATERA WHERE KATER_ID = KATERR;
  25.     IF KATERR_CHECK = 0 AND KATERR IS NOT NULL THEN
  26.         DBMS_OUTPUT.PUT_LINE('Неверный идентификатор катера');
  27.         RETURN 0;
  28.     END IF;
  29.     SELECT AVG(VOZRAT_DATE-VIHOD_DATE), COUNT(*) INTO AVERAGE, KOL_PLAVANIY FROM VMORE
  30.         INNER JOIN KATERA ON KATERA.KATER_ID=VMORE.KATER_ID
  31.         INNER JOIN MORYAKI ON MORYAKI.KATER_ID=KATERA.KATER_ID AND MORYAKI.moryak_id=MORYAKK
  32.         WHERE (SEZON IS NULL OR MOD(EXTRACT(MONTH FROM VIHOD_DATE)+1, 12) IN (SEZON*3-2, SEZON*3-1, SEZON*3))
  33.             AND (KATERR_CHECK = 0 OR KATERA.KATER_ID=KATERR);
  34.         IF KOL_PLAVANIY > 0 THEN
  35.             RETURN AVERAGE;
  36.         ELSE
  37.             RETURN 0;
  38.         END IF;
  39.     EXCEPTION
  40.     WHEN INVALID_MORYAKK THEN
  41.         DBMS_OUTPUT.PUT_LINE('Моряк не задан');
  42.         RETURN 0;
  43. END F_DAY;
  44. /
  45.  
  46. DECLARE
  47. NAM MORYAKI.FIO%TYPE;
  48. MOR_COUNT NUMBER;
  49. BEGIN
  50.     SELECT FIO INTO NAM FROM MORYAKI WHERE MORYAK_ID = 1; --ДЛЯ ПРОВЕРКИ
  51.     MOR_COUNT := F_DAY(1);
  52.     DBMS_OUTPUT.PUT_LINE('Для моряка ' || NAM || ' средняя длительность пребывания в море ' || MOR_COUNT || '.');
  53.     MOR_COUNT := F_DAY(1, 4, 1);
  54.     DBMS_OUTPUT.PUT_LINE('Для моряка ' || NAM || ' в сезоне '|| 4 || ' на катере '|| 1 || ' средняя длительность пребывания в море ' || MOR_COUNT || '.');
  55. END;
  56. /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement