Evo PostgreSQL funkcija koja proverava ispravnost unetog PIB-a.
CREATE OR REPLACE FUNCTION proveri_pib (pib varchar) RETURNS smallint AS
$body$
--
-- Funkcija 'proveri_pib' proverava ispravnost prosledjenog PIB-a
-- - pib: poreski identifikacioni broj u formatu NNNNNNNNK
-- N = cifra
-- K = kontrolna cifra
-- - Rezultat:
-- 1 = ako je pib ispravan,
-- 0 = ako pib nije ispravan.
--
DECLARE
i SMALLINT;
cifra SMALLINT;
saldo SMALLINT;
BEGIN
IF (pib IS NULL) OR (length(pib) <> 9) THEN
-- odbacivanje ocigledno losih pib-ova
RETURN 0;
ELSE
-- pib je ispravne duzine te se pristupa racunanju kontrolne cifre
saldo = 0;
FOR i IN 1 .. 8 LOOP
saldo = saldo + CAST(substring(pib from i for 1) AS SMALLINT);
IF saldo > 10 THEN saldo = saldo - 10; END IF;
saldo = 2 * saldo;
IF saldo > 10 THEN saldo = saldo - 11; END IF;
END LOOP;
cifra = 11 - saldo;
IF cifra > 10 THEN cifra = 0; END IF;
-- proveri kontrolnu cifru
IF cifra = CAST(substring(pib from 9 for 1) AS SMALLINT) THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END IF;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
Primer koriscenja ove funkcije.
Napravicemo tabelu 'partneri' koja ce izmedju ostalih atributa imati i atribut 'pib_partnera'. Nad ovom tabelom cemo postaviti CHECK CONSTRAINT koji nece dozvoliti unos neispravnog PIB-a.
CREATE TABLE partneri(
sifra_partnera CHAR(5) NOT NULL,
pib_partnera CHAR(9) NOT NULL,
naziv_partnera VARCHAR(50) NOT NULL,
CONSTRAINT sifra_partnera PRIMARY KEY (sifra_partnera),
CONSTRAINT ispravan_pib CHECK (proveri_pib(pib_partnera) = 1)
);
Ispravnost svega cemo proveriti pomocu podataka koji sadrze ispravne PIB-ove.
INSERT INTO partneri (sifra_partnera, pib_partnera, naziv_partnera)
VALUES ('00001', '100837287', 'Vinoprodukt-Coka doo');
INSERT INTO partneri (sifra_partnera, pib_partnera, naziv_partnera)
VALUES ('00002', '104256433', 'Zlatibo2r Voda doo');
COMMIT;
Ovi INSERT-i su prosli bez problema.
Takodje cemo pokusati da unesemo i jedan neispravan PIB
INSERT INTO partneri (sifra_partnera, pib_partnera, naziv_partnera)
VALUES ('00003', '100000111', 'Delyug ad');
COMMIT;
Ovaj INSERT je prijavio gresku 'new row for relation "partneri" violates check constraint "ispravan_pib"' jer je PIB Delyug-a 100000112, a ne 100000111.
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming." - Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo