Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Unikalne ID postacu PL 200001 AA
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
AcidBurnt
Witam

mam probelm nie mam pomysły jak w bazie, rozwiazac ze kazdy klijent ma miec unikalne ID postaci PL 2000001 AA, czy dla kazdego pola PL, 2000001, AA, zastosować osobne pole w tabeli?

1-szy człon ma byc nadawany recznie, pozostałe automatem, przy czym AA ma sie zmienic dopiero jak zabraknie 2000001, i numeracje zaczynamy od 2000001, ponizsze numerki nas nie obchodza.

jest 5:35 mam nadzieje ze w miare jasno udalo mi sie to przedstawic winksmiley.jpg

pozdro
SongoQ
Umiescil bym to w osobnych polach i zrobil to triggerem, sekwencja. W momencie dodania wywololywany jest trigger ktory dodaje Ci w kazdym polu rzeczy ktore wymagasz (oczywiscie wczesniej obliczajac wartosci)
AcidBurnt
no i mam problem troszke ze stworzeniem tego trigera...

SongoQ podrzuciał mi taki kodzik

  1. CREATE FUNCTION a() RETURNS TRIGGER AS $emp_stamp$
  2. DECLARE
  3. iNumer integer;
  4. iSeria integer;
  5. szSeria varchar;
  6. BEGIN iNumer := SELECT NEXTVAL(numer);
  7. IF iNumer > 999999 THEN
  8. iSeria := SELECT NEXTVAL(seria);
  9. -- Poczatek sekwencji SQL ktory ustawia na stan poczatkowy sekwencje
  10.  
  11. -- Zwrocenie numeru sekwencji numeru
  12.  
  13. -- Konwersja serii
  14.  
  15.  
  16. new.numer := iNumer;
  17. new.seria := szSeria;
  18. ELSE
  19. new.numer := iNumer;
  20. END IF;
  21.  
  22. RETURN NEW;
  23. END;
  24. $emp_stamp$ LANGUAGE plpgsql;
  25.  
  26. CREATE TRIGGER aa BEFORE INSERT ON aaa FOR EACH ROW EXECUTE PROCEDURE a();


tylko ze przy dodawaniu f-cji wywala mi takiego errora:

ERROR: syntax error at or near "SELECT" at character 9
QUERY: SELECT SELECT nextval(numer)
CONTEXT: SQL statement in PL/PgSQL function "a" near line 7
Jabol
Chyba masz problem w samym języku Plpgsql. W paru miejscach do przypisań używałbym raczej:
  1. SELECT NEXTVAL(blelele)
  2. INTO zmiennna FROM blelbleble;
W plpgsql'u select into oznacza umieszczenie wartości w zmiennej.
SongoQ
Zamiast
Cytat
iSeria := SELECT nextval(seria);


iSeria := nextval(seria);

Widze ze jednak nie poradziles sobie z moim przykladem, a wydawalo sie ze dalej sobie poradzisz.
Z przypisaniem do zmiennej nie przypominam sobie zebym Ci tak podawal, jesli tak to wkradl sie jakis blad.
AcidBurnt
no dobra zrobiłem tak:

  1. CREATE SEQUENCE numer
  2. INCREMENT 1
  3. MINVALUE 1
  4. MAXVALUE 10
  5. START 1
  6. CACHE 1
  7. CYCLE;
  8.  
  9. CREATE SEQUENCE seria
  10. INCREMENT 1
  11. MINVALUE 1
  12. MAXVALUE 10
  13. START 1
  14. CACHE 1
  15. CYCLE;
  16.  
  17. CREATE FUNCTION a() RETURNS TRIGGER AS $emp_stamp$
  18. DECLARE
  19. numer integer;
  20. seria integer;
  21. BEGIN numer := currval(numer);
  22. IF numer == 10 THEN
  23. seria := NEXTVAL(seria);
  24. new.numer := numer;
  25. new.seria := seria;
  26. ELSE
  27. new.numer := numer;
  28. new.seria := currval(seria);
  29. END IF;
  30.  
  31. RETURN NEW;
  32. END;
  33. $emp_stamp$ LANGUAGE plpgsql;
  34.  
  35. CREATE TRIGGER aa BEFORE INSERT ON test FOR EACH ROW EXECUTE PROCEDURE a();


wszystko sie dodało bez błedu tylko teraz jak ja mam dodawac dane to tabeli test

  1. CREATE TABLE test
  2. (
  3. id int8 NOT NULL DEFAULT NEXTVAL('test_id_seq'::regclass),
  4. numer int8,
  5. seria int2,
  6. CONSTRAINT test_pkey PRIMARY KEY (id)
  7. )


aby dodaly sie dane wygenerowane przez triggera
SongoQ
Wszystkie te pola automatycznie ustawia Ci trigger a id ustawia sekwencja.
Aby sprawdzic dzialanie musisz dodac jeszcze jakies pole i do tego pola dodawac.

  1. CREATE TABLE test
  2. (
  3. id int8 NOT NULL DEFAULT NEXTVAL('test_id_seq'::regclass),
  4. numer int8,
  5. seria int2,
  6. a varchar(100),
  7. CONSTRAINT test_pkey PRIMARY KEY (id)
  8. )
  9.  
  10. INSERT
  11. INTO test (a) VALUES ('sssssssssss')


Dodane:

  1. CREATE FUNCTION a() RETURNS TRIGGER AS $emp_stamp$
  2. DECLARE
  3. numer integer;
  4. seria integer;
  5. BEGIN numer := currval('numer');
  6. IF numer = 10 THEN
  7. seria := NEXTVAL('seria');
  8. new.numer := numer;
  9. new.seria := seria;
  10. ELSE
  11. new.numer := numer;
  12. new.seria := currval('seria');
  13. END IF;
  14. RETURN NEW;
  15. END;
  16. $emp_stamp$ LANGUAGE plpgsql;
AcidBurnt
po zapisaniu TRIGGERA w postaci

  1. DECLARE
  2. numer int4;
  3. seria int4;
  4. BEGIN numer := NEXTVAL('numer888');
  5. IF numer = 10 THEN
  6. seria := NEXTVAL('seria888');
  7. NEW.numer := numer;
  8. NEW.seria := seria;
  9. ELSE
  10. NEW.numer := numer;
  11. SELECT last_value
  12. FROM seria888 INTO NEW.seria; END IF;
  13. RETURN NEW;
  14. END;


zaczal dzialac wkoncu poprawnie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.