Funkcja i kursory

0

Usunięto

0
mrktos napisał(a):

Witam. Mam następujący problem.
Muszę napisać funkcję która zwraca rekordy typu nazwiska zawierające nazwiska dla których różnica w datach zatrudnienia jest najmniejsza.

Może zacznij od dokładenj specyfikacji problemu. Co masz zrobić? Wyliczyć różnicę w datach zatrudnienia pomiędzy czym a czym?
Pomiędzy wszystkimi (każde nazwisko dla każdego nazwiska?) rekordami z tabeli pracownicy?
Tyle, że to bez sensu zupełnie...

W funkcji muszę użyć kursorów. Pomoże ktoś bo nie mam zielonego pojęcia jak to zrobić...

Czego nie potrafisz? Nie wiesz co to ejst kursor, nie rozumiesz jak działa, czy ni wiesz jak się ich używa?
W sieci jest pełno treści na ten temat.

0

Nie znam postrgesa, nie widzę potrzeby używaniu tu kursorów.
Ale skoro chcesz przerabiać i dialekt nie ma dla Ciebie znaczenia to proszę, łap ideę.
Naskrobane w TSQL :)

 
with cteTemp as 
(
select a.nazwisko as nazwiskoA, a.data_zatrudnienia as data_zatrudnieniaA, b.nazwisko as nazwiskoB, b.data_zatrudnienia as data_zatrudnieniaB, 
	dateDiff(day, a.data_zatrudnienia, b.data_zatrudnienia) as Roznica
from pracownicy as a, pracownicy as b
where dateDiff(day, a.data_zatrudnienia, b.data_zatrudnienia) > 0
)

select *
from cteTemp where Roznica = (select min(Roznica) from cteTemp)
0

Czesc
w skrocie:
deklarujesz zmienne jesli potrzebne
deklarujesz kursor (dla laika cos podobnego jak tabela ktora chcesz wiersz po wierszu przeczytac)
otwierasz petla
w petli sprawdzasz swoj warunek i wyrzucasz co ci trzeba (naprzyklad do innej tabeli)
skaczesz do nastepnego wiersza
zamykasz na koncu kursor i wywalasz go z pamieci.

Pseudokod (szybka przerobka z dzialajacego gdzie indziej)

USE DB_MojeDane
GO

DECLARE @zmiennaJesliPotrzebna1 int;
DECLARE @zmiennaJesliPotrzebna2 int;

DECLARE MojKursor_cursor CURSOR FOR
SELECT (naprzyklad)ResNr, AboNr
FROM baza.[sch].tabela
ORDER BY CosTamResNr, PrzykladoweCosTamAboNr;

OPEN MojKursor_cursor;

FETCH NEXT From MojKursor_cursor
Into @zmiennaJesliPotrzebna1, @zmiennaJesliPotrzebna2;

WHILE @@FETCH_STATUS = 0
begin
UPDATE Albo InSERT TabelaZnalezionych
SET 
co tam chcesz

WHERE cosTam

A tu co innego jeszcze zrob

-- NEXT row -- inaczej bedzie "petlic" poki FETCH ist TRUE
FETCH NEXT FROM resNr_cursor
INTO @resNr, @AboNr;
end;

CLOSE resNr_CURSOR;
DEALLOCATE ResNr_cursor;
GO

1 użytkowników online, w tym zalogowanych: 0, gości: 1