szymcio10

Bazy danych - funkcje

May 14th, 2020
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- T1/2/A
  2.  
  3. CREATE OR REPLACE FUNCTION roznosci.piatek(liczba VARCHAR) RETURNS INTEGER AS $dzien$
  4.  
  5. DECLARE
  6. licznik INTEGER := 0;
  7. data_start VARCHAR :=liczba || '-01-13';
  8. data_koniec VARCHAR :=liczba || '-12-31';
  9. data_ogolna_s DATE := cast(data_start as DATE);
  10. data_ogolna_k DATE := cast(data_koniec as DATE);
  11.  
  12. BEGIN
  13. LOOP
  14.     IF EXTRACT(MONTH FROM data_ogolna_s)<EXTRACT(MONTH FROM data_ogolna_k) THEN
  15. IF ((SELECT date_part('dow',cast(data_ogolna_s AS DATE))::INTEGER) =  5) THEN
  16. licznik:=licznik+1;
  17. END IF;
  18. data_ogolna_s := data_ogolna_s+cast('1 months' as INTERVAL);
  19. ELSE
  20. RETURN licznik;
  21.     END IF;
  22. END LOOP;
  23. END;
  24.  
  25. $dzien$ LANGUAGE 'plpgsql';
  26.  
  27. --T1/2/B
  28.  
  29. CREATE OR REPLACE FUNCTION roznosci.lata(liczba VARCHAR) RETURNS INTEGER AS $lataka$
  30.  
  31. DECLARE
  32. licznik INTEGER := 0;
  33. data_start VARCHAR :='2020-05-01';
  34. data_koncowa VARCHAR :=data_start::DATE + interval '1 year'*liczba::INTEGER;
  35. data_ogolna_s DATE := cast(data_start as DATE);
  36. data_ogolna_k DATE := cast(data_koncowa as DATE);
  37.  
  38. BEGIN
  39. LOOP
  40.     IF EXTRACT(YEAR FROM data_ogolna_s)<=EXTRACT(YEAR FROM data_ogolna_k) THEN
  41. IF ((SELECT date_part('dow',cast(data_ogolna_s AS DATE))::INTEGER) =  3) THEN
  42. licznik:=licznik+1;
  43. END IF;
  44. data_ogolna_s := data_ogolna_s+cast('1 years' as INTERVAL);
  45. ELSE
  46. RETURN licznik;
  47.     END IF;
  48. END LOOP;
  49. END;
  50.  
  51. $lataka$ LANGUAGE 'plpgsql';
  52.  
  53. --T1/2/C
  54. CREATE OR REPLACE FUNCTION roznosci.stypendium(nr_a VARCHAR) RETURNS FLOAT AS $stypendium$
  55.  
  56. DECLARE
  57. stypendium FLOAT :=0;
  58. srednia FLOAT :=0;
  59.  
  60. BEGIN
  61. SELECT avg(o.ocena) INTO srednia FROM dziekanat.oceny as o WHERE o.nr_albumu = nr_a;
  62. IF srednia<=4 THEN
  63. stypendium=0;
  64. ELSIF srednia>4 AND srednia<4.5 THEN
  65. srednia=srednia-4;
  66. srednia=srednia*100;
  67. stypendium=srednia*5;
  68. ELSIF srednia>=4.5 AND srednia<5 THEN
  69. srednia=srednia-4.5;
  70. srednia=srednia*100;
  71. stypendium=250+(srednia*10);
  72. ELSIF srednia=5.0 THEN
  73. stypendium=1000;
  74. END IF;
  75. RETURN stypendium;
  76. END;
  77.  
  78. $stypendium$ LANGUAGE 'plpgsql';
  79.  
  80. --T2/2/A
  81. CREATE OR REPLACE FUNCTION roznosci.stypendium(nr_a VARCHAR) RETURNS FLOAT AS $stypendium$
  82.  
  83. DECLARE
  84. stypendium FLOAT :=0;
  85. srednia FLOAT :=0;
  86.  
  87. BEGIN
  88. IF (SELECT COUNT(*) FROM roznosci.stypendia) = 0 THEN
  89. CREATE TABLE roznosci.stypendia(
  90. nr_alb VARCHAR(30) UNIQUE NOT NULL,
  91. data_przyznania DATE NOT NULL,
  92. wartosc_sty FLOAT NOT NULL);
  93. ELSE
  94. SELECT avg(o.ocena) INTO srednia FROM dziekanat.oceny as o WHERE o.nr_albumu = nr_a;
  95. IF srednia<=4 THEN
  96. stypendium=0;
  97. ELSIF srednia>4 AND srednia<4.5 THEN
  98. srednia=srednia-4;
  99. srednia=srednia*100;
  100. stypendium=srednia*5;
  101. ELSIF srednia>=4.5 AND srednia<5 THEN
  102. srednia=srednia-4.5;
  103. srednia=srednia*100;
  104. stypendium=250+(srednia*10);
  105. ELSIF srednia=5.0 THEN
  106. stypendium=1000;
  107. END IF;
  108. END IF;
  109. INSERT INTO roznosci.stypendia(nr_alb, data_przyznania,wartosc_sty)
  110. VALUES (nr_a, CURRENT_DATE, stypendium);
  111. RETURN stypendium;
  112. END;
  113.  
  114. $stypendium$ LANGUAGE 'plpgsql';
  115.  
  116. --T2/2/B
  117. CREATE OR REPLACE FUNCTION roznosci.pesel(nr_a VARCHAR) RETURNS BOOLEAN AS $stypendium$
  118.  
  119. DECLARE
  120. pesl VARCHAR :='';
  121. znak VARCHAR :='';
  122. kod INTEGER;
  123. i INTEGER := 1;
  124. dlugosc INTEGER :=0;
  125. BEGIN
  126. SELECT pe.pesel INTO pesl FROM dziekanat.studenci as pe WHERE pe.nr_albumu = nr_a;
  127. dlugosc := length(pesl);
  128. LOOP
  129. znak := substring(pesl, i, 1);
  130. kod := ascii(znak);
  131. IF NOT kod BETWEEN ascii('0') AND ascii('9') THEN
  132. RAISE NOTICE 'Pesel zawiera nieprawidłowy znak: %', znak;
  133. RETURN FALSE;
  134. END IF;
  135. i := i+1;
  136. IF i > dlugosc THEN
  137. RETURN TRUE;
  138. END IF;
  139. END LOOP;
  140. END;
  141.  
  142. $stypendium$ LANGUAGE 'plpgsql';
Advertisement
Add Comment
Please, Sign In to add comment