[ CandyMan @ 28.12.2004. 10:03 ] @
Kako na nivou ograničenja u bazi (constraint) dozvoliti unos samo brojeva u polje znakovnog tipa (char/varchar) u nekoj tabeli?

Korisno za JMBG ili PIB - sastoje se samo od brojeva, ali imaju vodeće nule pa moraju biti znakovnog tipa.

// Edit by StRiPy: Izmijenio sam samo naslov teme, radi lakseg snalazenja.

[Ovu poruku je menjao StRiPy dana 08.04.2005. u 17:01 GMT+1]
[ Dejan Topalovic @ 29.12.2004. 02:15 ] @
Hm, ne znam da li sam dobro shvatio pitanje, ali pokusacu odgovoriti.
Prvo kreiraj funkciju is_number.
Code:

CREATE OR REPLACE FUNCTION is_number (
  char_in VARCHAR2)
  RETURN BOOLEAN
IS

n  NUMBER;

BEGIN
  n := TO_NUMBER(char_in);

  RETURN TRUE;

EXCEPTION
  WHEN OTHERS THEN
    RETURN FALSE;

END is_number;
/

Zatim kreiraj tabelu sa poljem na koje ces staviti constraint CHECK:
Code:

...
broj VARCHAR2(100),
CONSTRAINT samo_brojevi CHECK(is_number(broj))

ili ako ces imas postojecu tabelu, onda sa ALTER:
Code:

ALTER TABLE tabela
ADD CONSTRAINT samo_brojevi CHECK(is_number(broj));

Nadam se da je to ono na sta si mislio ...
[ CandyMan @ 29.12.2004. 07:47 ] @
Dobro si razumeo. Rešenje je ok, ali nije baš elegantno...

Dakle, string funkcije LTRIM(Param1, Param2) i RTRIM(Param1, Param2) trimuju string Param1 sa leve, odnosno desne strane, znakovima koji se nalaze u Param2 sve dok ne naidju na nesto čega nema u Param2 i vraćaju ostatak stringa.

Ako se string Param1 sastoji samo od cifara, LTRIM(Param1, '0123456789') vraća NULL. Ograničenje bi trebalo da izgleda ovako:
Code:

ALTER TABLE Neka_Tabela ADD CONSTRAINT SAMO_BROJ
         CHECK ( LTRIM(NekoPolje,'0123456789') IS NULL )
[ Dejan Topalovic @ 08.04.2005. 15:56 ] @
A sta ako ne unosis samo cifre, nego se unos sastoji i od cifara i od slova?

Npr. imas string test = 'trim0123bla_fake456789trim' i ako koristis LTRIM(test,'trim') i RTRIM(test,'trim'), dobices nazad trimovani string, ali ce on i dalje sadrzavati slova zajedno sa ciframa.

Zato je ono moje rjesenje sigurnije i bolje.
[ CandyMan @ 13.04.2005. 13:23 ] @
Želimo da zabranimo unos stringa koji u sebi ne sadrži samo brojeve. Ukoliko trimovanje stringa navedenim stringom 0123456789 vrati neku vrednost, string koji želimo da upišemo u bazu ne zadovoljava uslov da sadrži samo brojeve i kao takav uzrokuje grešku i tako dalje redom.
Nije mi baš jasno, šta hoćeš da kažeš sa tim bolje rešenje?