Można to zrobić na kilka sposobów.
Pierwszy jaki mi przychodzi do głowy i najłatwiejszy, to funkcje i refcursory.
Refcursor nabiera kształtu podczas wykonywania danych, zatem nie trzeba mu deklarować odpowiedniej struktury.
Wyglądać to może tak
merlin=# BEGIN;
BEGIN
merlin=# SELECT * FROM nr_tygodnia(49, 'cursorek'); cur
----------
cursorek
(1 row)
merlin=# fetch all from cursorek;
49
------------
2009-11-30
2009-12-01
2009-12-02
2009-12-03
2009-12-04
2009-12-05
2009-12-06
(7 rows)
merlin=# END;
COMMIT
i funkcja (klępnięta na szybko)
CREATE OR REPLACE FUNCTION nr_tygodnia(IN arg1 integer, IN OUT cur refcursor) RETURNS refcursor AS
$BODY$declare
nrtg int;
begin
SELECT EXTRACT(week FROM NOW()) INTO nrtg;
OPEN cur FOR EXECUTE 'SELECT current_date+gs.a as "'||nrtg||'"
FROM generate_series(0,10) as gs(a)
WHERE EXTRACT(week FROM current_date + gs.a)='||arg1;
return;
end;$BODY$
LANGUAGE 'plpgsql' VOLATILE;
Plusy:
- nie dajesz developerom dostępu do pure sqla, dostają tylko funkcje która ma w sobie mega optymalne zapytanie
- jako programista bazodanowy ty optymalizujesz zapytania i masz władze nad zapytaniami do bazy
i nie masz obawy ze bokiem idzie jakieś analityczne zapytanie :]
Minusy:
- to parametryzowanie funkcji, które trzeba wołać w transakcji (bo gdyż na przestrzeni danej transakcji będzie istniał Twój nazwany kursor)
Ostatnio edytowany przez psocha (2009-11-30 21:12:44)
Pozdrawiam
Pawel Socha