Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
PAGE 3
13 Вкладені алгоритми
Задача 4. Виготовити звіт про сумарний обєм транспортованого газу за поточний рік по кожному підприємству для заданого газопровода. До заголовка звіту додати назву газопроводу, слова “станом на” і встановити поточну дату.
Таблиця gazpr (газопроводи):
1 Україна 1 1400
2 Ямпіль-Ужгород-держкордон 2 1400
3 Острогожськ-Гадяч 2 1000
4 Єлецьк-Орел 7 1200
5 Єлецьк-Десна-Кривий Ріг 5 1600
Таблиця pidpr (підприємства):
1 Харківтрансгаз Харків
2 Прикарпаттрансгаз Івано-Франківськ
3 Київтрансгаз Київ
4 Львівтрансгаз Львів
5 Експорттрансгаз Ужгород
Таблиця оblik (облік):
2 2 2005-04-12 2
2 2 2012-04-12 2
2 5 2012-02-11 1
3 5 2012-09-10 3
2 5 2012-07-01 4
Zvit_cykl без курсора:
CREATE OR REPLACE FUNCTION zvit_cykl(integer)
RETURNS text AS
$$
DECLARE
zapysp pidpr %ROWTYPE; zapyso oblik %ROWTYPE; zapysg gazpr %ROWTYPE;
name_g gazpr.naz_g %TYPE; kod ALIAS FOR $1;
den INTEGER; mis INTEGER; rik INTEGER; ms CHARACTER(9) ARRAY[12];
slovo TEXT; s REAL; b BOOL;
BEGIN
den:=EXTRACT(DAY FROM CURRENT_DATE);
mis:=EXTRACT(MONTH FROM CURRENT_DATE);
rik:=EXTRACT(YEAR FROM CURRENT_DATE);
ms[1]:='січня'; ms[2]:='лютого'; ms[3]:='березня'; ms[4]:='квітня';
ms[5]:='травня'; ms[6]:='червня'; ms[7]:='липня'; ms[8]:='серпня';
ms[9]:='вересня'; ms[10]:='жовтня'; ms[11]:='листопада'; ms[12]:='грудня';
SELECT INTO name_g naz_g FROM gazpr WHERE kod_g = kod;
slovo:=' Звіт'||E'\n';
slovo:=slovo ||'про кількість транспортованого газу по газопроводу '||name_g||E'\n';
slovo:=slovo ||'станом на '||TO_CHAR(den,'99')||' '||ms[mis]||' '|| TO_CHAR(rik, '9999')||E'\n\n';
slovo:=slovo ||'Підприємство Кількість'||E'\n';
slovo:=slovo ||'-----------------------------------------------'||E'\n';
FOR zapysp IN SELECT * FROM pidpr ORDER BY naz_p LOOP
s:=0;
FOR zapyso IN SELECT * FROM oblik LOOP
b:=zapyso.kod_g=kod;
b:=b AND zapyso.kod_p=zapysp.kod_p;
b:=b AND rik=EXTRACT(YEAR FROM zapyso.data);
IF b THEN s:=s+zapyso.kilk; END IF;
END LOOP;
IF s>0 THEN slovo:=slovo||zapysp.naz_p||' '||TO_CHAR(s, '99.9')||E'\n';
END IF;
END LOOP;
RETURN slovo;
END;
$$
LANGUAGE plpgsql;
select zvit_cykl(2);
Звіт
про кількість транспортованого газу по газопроводу Ямпіль-Ужгород-держкордон
станом на 17 листопада 2012 року
Підприємство Кількість
-----------------------------------------------
Експорттрансгаз 5.0
Прикарпаттрансгаз 2.0
Задача 6. Виготовити звіт про розподіл кількості транспортованого газу на кожному газопроводі по підприємствах у поточному році. Навпроти назв газопроводів установити значення кількості для кожного підприємства. Передбачити підсумки по вертикалі і по горизонталі.
1 Україна 8 1400
3 Уренгой-Помари-Ужгород 6 1800
4 Гадяч-Париж 7 1500
5 Гадяч-держкордон 2 800
2 Єлецьк-Орел 8 123
1 Київтрансгаз Київ
2 Гадячгазпром Полтава
3 Львівгазпром Львів
4 Прикарпаттрансгаз Галич
1 2 3 2010-06-12
2 2 5 2011-06-12
3 2 3 2012-07-31
4 2 5 2011-09-21
2 3 4 2012-06-13
9 4 2 2009-10-25
3 3 5 2012-12-16
2 2 2 2012-11-15
Звіт про розподіл:
CREATE OR REPLACE FUNCTION vklc_rozpod() RETURNS text AS
$$
DECLARE
zapysp pidpr %ROWTYPE; zapyso oblik %ROWTYPE; zapysg gazpr %ROWTYPE;
slovo TEXT; s oblik.kilk %TYPE; suma oblik.kilk %TYPE; b BOOL:=FALSE;
sss oblik.kilk %TYPE:=0; ss INTEGER ARRAY[5]; i integer;
BEGIN
slovo:=repeat(' ', 40)||'Звіт'||E'\n';
slovo:=slovo ||repeat(' ', 15)||'про розподіл кількості транспортованого газу по підприємствах' ||E'\n'||E'\n';
slovo:=slovo ||'Підприємство: ';
FOR zapysp IN SELECT * FROM pidpr LOOP
slovo:=slovo ||rpad(zapysp.naz_p,15);
END LOOP;
slovo:=slovo ||' Сума '||E'\n';
ss[1]:=0; ss[2]:=0; ss[3]:=0; ss[4]:=0; ss[5]:=0;
FOR zapysg IN SELECT * FROM gazpr LOOP
slovo:=slovo || rpad(zapysg.naz_g, 20) ||' '; suma:=0; i:=1;
FOR zapysp IN SELECT * FROM pidpr LOOP
s:=0;
FOR zapyso IN SELECT * FROM oblik LOOP
b:=zapyso.kod_g=zapysg.kod_g AND zapyso.kod_p=zapysp.kod_p;
IF b THEN s:=s+zapyso.kilk;END IF;
END LOOP; suma:=suma+s; ss[i]:=ss[i]+s; i:=i+1;
slovo:=slovo||TO_CHAR(s,'999999999999')||' ';
END LOOP; i:=1;
slovo:=slovo||TO_CHAR(suma,'9999999')||E'\n';
ss[5]:=ss[5]+suma;
END LOOP;
slovo:=slovo ||repeat(' ', 14)||'Всього'||TO_CHAR(ss[1],'9999999999999')||
TO_CHAR(ss[2],'99999999999999');
slovo:=slovo ||TO_CHAR(ss[3],'99999999999999')||TO_CHAR(ss[4],'99999999999999');
slovo:=slovo ||TO_CHAR(ss[5],'999999999')||E'\n';
RETURN slovo;
END;
$$
LANGUAGE plpgsql;
SELECT vklc_rozpod();
Звіт
про розподіл кількості транспортованого газу по підприємствах
Підприємство: Київтрансгаз Гадячгазпром Львівгазпром Прикарпаттрансг Сума
Україна 0 3 0 0 3
Уренгой-Помари-Ужгор 0 3 5 0 8
Гадяч-Париж 0 5 0 0 5
Гадяч-держкордон 0 0 0 0 0
Єлецьк-Орел 0 7 4 0 11
Всього 0 18 9 0 27