CREATE OR REPLACE FUNCTION roznosci.sprawdz_pesel(nr_albumu CHARACTER VARYING) RETURNS BOOLEAN AS $BODY$ DECLARE pesel VARCHAR(256) := ''; znak VARCHAR := ''; kod INTEGER; z INTEGER; w INTEGER; i INTEGER := 1; j INTEGER:=1; dlugosc INTEGER := 0; suma INTEGER:=0; wagi VARCHAR(10):='9731973197'; modd INTEGER:=0; BEGIN SELECT s.pesel INTO pesel FROM dziekanat.studenci s WHERE s.nr_albumu = $1; dlugosc := length(pesel); --Sprawdzenie długośći peselu IF dlugosc <>11 THEN RAISE NOTICE 'Pesel jest niepoprawny.'; RETURN FALSE; END IF; -- Sprawdzenie czy występują tylko dozwolone znaki i obliczanie sumy kontrolnej LOOP znak := substring(pesel, i, 1); kod := ascii(znak); IF NOT kod BETWEEN ascii('0') AND ascii('9') THEN RAISE NOTICE 'Pesel zawiera nie prawidłowy znak: %', znak; RETURN FALSE; END IF; i := i+1; IF i > dlugosc THEN LOOP w := substring(wagi, j, 1)::INTEGER; z := substring(pesel, j, 1)::INTEGER; IF j<=10 THEN suma:=suma+(w*z); END IF; j := j+1; IF j>10 THEN modd=suma%10; IF modd=10 THEN modd=0; END IF; IF modd=substring(pesel, 11, 1)::INTEGER THEN RETURN TRUE; END IF; RETURN FALSE; END IF; END LOOP; END IF; END LOOP; END; $BODY$ LANGUAGE 'plpgsql';