Thursday, October 18, 2018

Odczyt danych z tabel i widoków w PL/pgSQL


W zależności od tego czy chcemy pobierać jeden czy więcej wierszy, stosujemy albo konstrukcję select into, albo kursor. Jeśli mamy pewność że zostanie odczytany dokładnie jeden wiersz, możemy użyć takiej konstrukcji:


do
$$
declare
ilu integer;
begin
select count(*) into ilu from ludziki;
raise notice 'mamy % ludzików',ilu;
end $$;


Wartości odczytywane są przekazywane do zmiennych pozycyjnie. Tj w tym przypadku wynik count(*) wyląduje w zmiennej ile. Gdybyśmy zechcieli, możemy też odczytać więcej wartości:


do
$$
declare
ilu integer;
najstarszy integer;
begin
select count(*),max(wiek) into ilu,najstarszy from ludziki;
raise notice 'mamy % ludzików',ilu;
raise notice 'najstarszy ma % lat',najstarszy;
end $$;

W takim przypadku wynik count(*) wyląduje w zmiennej "ile"a wynik max(wiek) wyląduje w zmiennej "najstarszy" - czyli zgodnie z kolejnością. Ilość podstawianych zmiennych musi zawsze odpowiadać ilości zwracanych wartości.


Jeśli chcemy odczytać więcej niż jeden wiersz, niezbędny nam będzie kursor. Ważne - kursor nie przechowuje danych, a jedynie pozwala na ich odczyt. Odczyt będzie przebiegał wiersz po wierszu, nie musisz się więc martwić o wycieki pamięci. Na potrzeby przetwarzania kursorów powstała też specjalna pętla, która niejawnie kursor otwiera, zamyka, a także powoduje odczyt kolejnych wierszy. Pętla obróci się więc tyle razy, ile będzie wierszy w zapytaniu na podstawie którego powstał kursor. Wewnątrz tej pętli mam dostęp do aktualnie odczytanego wiersza, mogę więc go np. wypisać na konsolę. Tutaj są dwa warianty. Albo robimy to tak jak w bazach Oracle i wymieniamy wszystkie kolumny po kolei:


do
$$
declare
k cursor for select * from ludziki;
begin
for w in k loop
raise notice '% % % %',w.id,w.imie,w.nazwisko,w.wiek;
end loop;
end $$;



Albo... odnosząc się do całego wiersza (i tutaj programiści Oracle PL/SQL padają z wrażenia):


do
$$
declare
k cursor for select * from ludziki;
begin
for w in k loop
raise notice '%',w;
end loop;

end $$;



Ćwiczenia

  1. Napisz program który odczyta i wyświetli na konsoli średni, najwyższy i najniższy wiek z tabeli ludziki.
  2. Napisz program który wyświetli na konsoli osoby starsze niż średnia wieku wśród wszystkich osób z tabeli ludziki. Osoby mają być wyświetlane w ten sposób, by podane było ich imię, nazwisko, wiek, oraz różnica w stosunku do średniego wieku - przycięta do jednostek. Osoby mają być wyświetlone od najstarszej do najmłodszej.

No comments:

Post a Comment

Bezpłatny kurs PL/pgSQL by Andrzej Klusiewicz

Cześć  :) Oddaję w Wasze ręce wersję 1.0.0.0.0.(0) swojego tutoriala dotyczącego języka PL/pgSQL - czyli proceduralnego języka przetwarza...