patternsqlMinor
Converting SQL SERVER Procedure to POSTGRESQL
Viewed 0 times
postgresqlsqlprocedureserverconverting
Problem
I have procedure in SQL Server to print all players of given country.
I try to convert it into plpgsql, but I get errors.
SQL Server Procedure
Doesn't work function in PostgreSql
I try to convert it into plpgsql, but I get errors.
SQL Server Procedure
CREATE PROCEDURE kraj_pilkarze @kraj varchar(30)
AS
DECLARE @idkraj INT
DECLARE @nazwa_zespolu varchar(30)
SELECT @idkraj = id_kraj FROM kraj WHERE @kraj=nazwa
DECLARE kursor_pilk CURSOR
FOR SELECT imie,nazwisko, id_zespol, id_kraj FROM pilkarz
DECLARE @imie varchar(20), @nazwisko varchar(30), @zespol int, @d_kraj int
OPEN kursor_pilk
FETCH NEXT FROM kursor_pilk INTO @imie, @nazwisko,@zespol, @d_kraj
WHILE @@FETCH_STATUS=0
BEGIN
IF @d_kraj=@idkraj
BEGIN
SELECT @nazwa_zespolu = nazwa FROM zespol WHERE @zespol=id_zespol
PRINT @imie+' '+@nazwisko+', '+@nazwa_zespolu
FETCH NEXT FROM kursor_pilk INTO @imie, @nazwisko,@zespol,@d_kraj
END
ELSE
BEGIN
FETCH NEXT FROM kursor_pilk INTO @imie, @nazwisko,@zespol,@d_kraj
END
END
CLOSE kursor_pilk
DEALLOCATE kursor_pilkDoesn't work function in PostgreSql
CREATE FUNCTION kraj_pilkarze(p_kraj varchar(30))
RETURNS VOID AS $
BEGIN
DECLARE p_idkraj INT;
DECLARE p_nazwa_zespolu varchar(30);
DECLARE p_imie varchar(20), p_nazwisko varchar(30), p_zespol int, d_kraj int;
SELECT INTO p_idkraj id_kraj FROM kraj WHERE p_kraj=nazwa;
DECLARE kursor_pilk CURSOR FOR
SELECT imie,nazwisko, id_zespol, id_kraj FROM pilkarz;
OPEN kursor_pilk;
FETCH NEXT FROM kursor_pilk INTO p_imie, p_nazwisko,p_zespol, d_kraj;
WHILE (FOUND) LOOP
IF d_kraj=p_idkraj THEN
SELECT INTO p_nazwa_zespolu nazwa FROM zespol WHERE @zespol=id_zespol;
RAISE NOTICE '% %, %',p_imie,p_nazwisko,p_nazwa_zespolu;
FETCH NEXT FROM kursor_pilk INTO p_imie, p_nazwisko,p_zespol,d_kraj;
ELSE
FETCH NEXT FROM kursor_pilk INTO p_imie, p_nazwisko,p_zespol,d_kraj;
END IF;
END LOOP;
CLOSE kursor_pilk;
END;
$ LANGUAGE PLPGSQL;Solution
It's way easier in plpgsql:
But the following even simpler one would do the exact same thing:
And you can achieve the same thing straight without even creating a function:
CREATE FUNCTION kraj_pilkarze(p_kraj varchar(30)) RETURNS VOID AS $
DECLARE
_r RECORD;
_id_kraj int;
_nazwa_zespolu text;
BEGIN
_id_kraj := id_kraj FROM kraj WHERE nazwa = $1;
FOR _r IN
SELECT imie, nazwisko, id_zespol, id_kraj FROM pilkarz
LOOP
IF r.id_kraj = _id_kraj THEN
_nazwa_zespolu := nazwa FROM zespol WHERE zespol = _r.id_zespol;
RAISE NOTICE '% %, %', _r.imie, _r.nazwisko, _nazwa_zespolu;
END IF;
END LOOP;
END;
$ LANGUAGE PLPGSQL;But the following even simpler one would do the exact same thing:
CREATE FUNCTION kraj_pilkarze(p_kraj varchar(30)) RETURNS VOID AS $
DECLARE
_r RECORD;
BEGIN
FOR _r IN
SELECT imie, nazwisko, id_zespol, id_kraj, (SELECT nazwa FROM zespol WHERE zespol = p.id_zespol) nazwa
FROM pilkarz p WHERE id_kraj = (id_kraj FROM kraj WHERE nazwa = $1)
LOOP
RAISE NOTICE '% %, %', _r.imie, _r.nazwisko, _r.nazwa;
END LOOP;
END;
$ LANGUAGE PLPGSQL;And you can achieve the same thing straight without even creating a function:
DO $
DECLARE
_r RECORD;
BEGIN
FOR _r IN
SELECT imie, nazwisko, id_zespol, id_kraj, (SELECT nazwa FROM zespol WHERE zespol = p.id_zespol) nazwa
FROM pilkarz p WHERE id_kraj = (id_kraj FROM kraj WHERE nazwa = $1)
LOOP
RAISE NOTICE '% %, %', _r.imie, _r.nazwisko, _r.nazwa;
END LOOP;
END;
$;Code Snippets
CREATE FUNCTION kraj_pilkarze(p_kraj varchar(30)) RETURNS VOID AS $$
DECLARE
_r RECORD;
_id_kraj int;
_nazwa_zespolu text;
BEGIN
_id_kraj := id_kraj FROM kraj WHERE nazwa = $1;
FOR _r IN
SELECT imie, nazwisko, id_zespol, id_kraj FROM pilkarz
LOOP
IF r.id_kraj = _id_kraj THEN
_nazwa_zespolu := nazwa FROM zespol WHERE zespol = _r.id_zespol;
RAISE NOTICE '% %, %', _r.imie, _r.nazwisko, _nazwa_zespolu;
END IF;
END LOOP;
END;
$$ LANGUAGE PLPGSQL;CREATE FUNCTION kraj_pilkarze(p_kraj varchar(30)) RETURNS VOID AS $$
DECLARE
_r RECORD;
BEGIN
FOR _r IN
SELECT imie, nazwisko, id_zespol, id_kraj, (SELECT nazwa FROM zespol WHERE zespol = p.id_zespol) nazwa
FROM pilkarz p WHERE id_kraj = (id_kraj FROM kraj WHERE nazwa = $1)
LOOP
RAISE NOTICE '% %, %', _r.imie, _r.nazwisko, _r.nazwa;
END LOOP;
END;
$$ LANGUAGE PLPGSQL;DO $$
DECLARE
_r RECORD;
BEGIN
FOR _r IN
SELECT imie, nazwisko, id_zespol, id_kraj, (SELECT nazwa FROM zespol WHERE zespol = p.id_zespol) nazwa
FROM pilkarz p WHERE id_kraj = (id_kraj FROM kraj WHERE nazwa = $1)
LOOP
RAISE NOTICE '% %, %', _r.imie, _r.nazwisko, _r.nazwa;
END LOOP;
END;
$$;Context
StackExchange Database Administrators Q#138563, answer score: 6
Revisions (0)
No revisions yet.