Funkcja dodająca rekord w tabeli PLPGSQL

0

Postaram się nakreślić problem bez wrzucania całej bazy.
Zadanie jest następujące:
Stworzyć bazę danych biblioteka zawierającą informację o zbiorze (książki, płyty, gry, itd.), osobach wypożyczających oraz wypożyczeniach.
Funkcja: Funkcja plpgsql dodająca wypożyczenie, z założeniem, że przedmiot, nie może być wypożyczony po raz drugi.

Stworzone tabele: przedmioty, osoby, wypozyczenia.
Tabela wypożyczenia ma 3 kolumny: id_wypozyczenia, id_osoby, id_przedmiotu. Id_osoby i id_przedmiotu w relacji z pozostałymi tabelami, więc w tej tabeli znajdują się same wartości integer.
Rozumiem, że funkcja musi wyciągnąć wartości z kolumny id_przedmiotu, porównać z wprowadzanym i jeśli jest równe - zakończyć, jeślie nie - dodać insertem do tabeli wartości.
Brzmi dość prosto, ale każda próba kończyła się pominięciem warunku i dodaniem rekordu.

Część kodu (niedokładny i niekompletny, chcę tylko nakreślić):

CREATE OR REPLACE FUNCTION dodaj_pozyczenie(id_poz integer, id_oso integer, id_prz integer) RETURN VOID AS 
DECLARE x integer
BEGIN
FOR x in Select id_przedmiotu from wypozyczenia
LOOP
IF id_przedmiotu = id_prz THEN EXIT;
ELSE INSERT INTO wypozyczenia VALUES (id_poz, id_oso, id_prz);
END IF;
Return NEXT x;
End LOOP;
END
Language plpgsql
0

Od razu się przyznam, że nigdy nic nie robiłem w postgresql. Ale czy nie można tam napisać czegoś takiego:

SELECT COUNT(*) INTO @x FROM tabela WHERE tabela.kolumna = @wartosc 

.Chyba by było prościej.

0

INSERT INTO ... SELECT ... WHERE NOT EXISTS(SELECT * FROM wypozyczenia WHERE id_przedmiotu = id_prz)
Zero TRRIGERówCURSORów i pętli

0

Czyli cała funkcja zwraca voida i wystarczy ta jedna linia. Tylko pytanie do tego selecta, ostatecznie wyglądałoby tak:
INSERT INTO wypozyczenia SELECT ? WHERE NOT EXISTS(SELECT * FROM wypozyczenia WHERE id_przedmiotu = id_prz)

0

Mam coś takiego:

 
CREATE OR REPLACE FUNCTION nowe_pozyczenie(
    id_poz integer,
    id_oso integer,
    id_prze integer)
  RETURNS void AS
BEGIN

INSERT INTO pozyczenia (id_pozycz, osoba_poz, przedmiot_poz)
SELECT * FROM (SELECT id_poz, id_oso, id_prze) AS tmp
WHERE NOT EXISTS 
(SELECT * FROM pozyczenia WHERE przedmiot_poz = id_prze);

END
  LANGUAGE plpgsql VOLATILE

Dostaję błąd (przy wprowadzeniu danych): BŁĄD: nazwa kolumny "id_prze" jest niejednoznaczna

0
CREATE OR REPLACE FUNCTION nowe_pozyczenie(
    id_poz INTEGER,
    id_oso INTEGER,
    id_prze INTEGER)
  RETURNS void AS
BEGIN
 
INSERT INTO pozyczenia (id_pozycz, osoba_poz, przedmiot_poz)
SELECT * FROM (SELECT $1, $2, $3) AS tmp
WHERE NOT EXISTS 
(SELECT * FROM pozyczenia WHERE przedmiot_poz = $3);
 
END
  LANGUAGE plpgsql VOLATILE

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