Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
15 Звіт з курсором
Задача 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
CREATE OR REPLACE FUNCTION zvit(integer)
RETURNS text AS
$$
DECLARE
name_p pidpr.naz_p %TYPE; kilkist oblik.kilk %TYPE; name_g gazpr.naz_g %TYPE;
den INTEGER; mis INTEGER; rik INTEGER; ms CHARACTER(9) ARRAY[12];
slovo TEXT; kod ALIAS FOR $1;
kursor CURSOR FOR
SELECT pidpr.naz_p, SUM(oblik.kilk) FROM pidpr
INNER JOIN oblik ON pidpr.kod_p = oblik.kod_p
WHERE oblik.kod_g=kod
AND EXTRACT(YEAR FROM CURRENT_DATE)=EXTRACT(YEAR FROM OBLIK.DATA)
GROUP BY pidpr.naz_p
ORDER BY pidpr.naz_p;
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';
OPEN kursor;
LOOP
FETCH kursor INTO name_p, kilkist;
exit when not found;
slovo:=slovo||name_p||' '||TO_CHAR(kilkist,'99.9')||E'\n';
END LOOP;
CLOSE kursor;
RETURN slovo;
END;
$$
LANGUAGE plpgsql;
select zvit(2);
Звіт
про кількість транспортованого газу по газопроводу Ямпіль-Ужгород-держкордон
станом на 12 квітня 2011
Підприємство Кількість
-----------------------------------------------
Експорттрансгаз 5.0
Прикарпаттрансгаз 2.0
Задача 6. Виготовити звіт про розподіл кількості транспортованого газу на кожному газопроводі по підприємствах у поточному році. Навпроти назв газопроводів установити значення кількості для кожного підприємства. Передбачити підсумки по вертикалі і по горизонталі.
CREATE OR REPLACE FUNCTION rozpod_zk() 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;
kursor CURSOR FOR
SELECT zapyso.kod_g, zapysg.naz_g, zapyso.kod_p, zapysp.naz_p, sum(zapyso.kilk) AS kilkist FROM oblik
INNER JOIN gazpr ON(zapyso.kod_g=zapysg.kod_g)
INNER JOIN pidpr ON(zapyso.kod_p=zapysp.kod_p)
GROUP BY zapyso.kod_g, zapysg.naz_g, zapyso.kod_p, zapysp.naz_p
ORDER BY zapysg.naz_g;
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;
OPEN kursor;
LOOP
FETCH next FROM kursor INTO kodg, nazvag, kodp, nazvap, kilkist;
exit when not found;
slovo:=slovo || rpad(nazvag,25)||rpad(nazvap,15)||rpad(TO_CHAR(kilkist,'99'),16)||E'\n';
END LOOP;
CLOSE kursor;
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 rozpod_zk();
Проба:
CREATE OR REPLACE FUNCTION rozpod_zk() RETURNS text AS
$$
DECLARE
kodg gazpr.kod_g %TYPE; kodp pidpr.kod_p %TYPE;
namep pidpr.naz_p %TYPE; kilkist oblik.kilk %TYPE; nameg gazpr.naz_g %TYPE;
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;
kursor CURSOR FOR
SELECT zapyso.kod_g, zapysg.naz_g, zapyso.kod_p, zapysp.naz_p, sum(zapyso.kilk) AS kilkist FROM oblik
INNER JOIN gazpr ON(zapyso.kod_g=zapysg.kod_g)
INNER JOIN pidpr ON(zapyso.kod_p=zapysp.kod_p)
GROUP BY zapyso.kod_g, zapysg.naz_g, zapyso.kod_p, zapysp.naz_p
ORDER BY zapysg.naz_g;
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;
OPEN kursor;
LOOP
FETCH next FROM kursor INTO kodg, nameg;
--, kodp, namep, kilkist
exit when not found;
slovo:=slovo || TO_CHAR(kodg,'99')||rpad(nameg,25)||E'\n';
--||rpad(namep,15)||rpad(TO_CHAR(kilkist,'99'),16)
END LOOP;
CLOSE kursor;
--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 rozpod_zk();
" Звіт
про розподіл кількості транспортованого газу по підприємствах
Підприємство: Київтрансгаз Гадячгазпром Львівгазпром Прикарпаттрансг Сума
"