konto usunięte

Temat: Trigger-

Witam czy wiecie może jak napisac triggera który będzie robił insert-a w pierwszym wolnym miejscu?
CREATE SEQUENCE USER_SEQ INCREMENT BY 1
START WITH 1
NOMAXVALUE
NOMINVALUE
NOCACHE
NOCYCLE NOORDER ;

CREATE OR REPLACE TRIGGER user_trigger
BEFORE INSERT
ON USER
REFERENCING NEW AS NEW
FOR EACH ROW
BEGIN
SELECT USER_SEQ.nextval INTO :NEW.IDUSER FROM dual;
END;

Aktualnie trigger działa jak autoincreament. Tylko jak usunę element o id które nie jest ostanie insert dodaje element na następne miejsce po ostatnim a bym chciał żeby dodawał w pierwsze wolne miejsce.Marek Matuszewski edytował(a) ten post dnia 07.04.11 o godzinie 20:42
Grzegorz D.

Grzegorz D. PL/SQL Developer

Temat: Trigger-

Próbowałeś wykorzystać funkcje analityczne LEAD/LAG ? Może się przydadzą.

Poczytaj tu :
http://www.oracle-base.com/articles/misc/LagLeadAnalyt...

konto usunięte

Temat: Trigger-

To nie z sekwencji, tylko trzeba przeczesać tabelkę (niestety przy każdym wstawianym wierszu):

select min(rn)
into :new.iduser
from (select row_number() over (order by iduser) rn, iduser from users)
where iduser != rn


Z drugiej strony, co komu przeszkadzają dziury w numeracji... to tylko identyfikatory.

konto usunięte

Temat: Trigger-

Łukasz Pluta:
To nie z sekwencji, tylko trzeba przeczesać tabelkę (niestety przy każdym wstawianym wierszu):

select min(rn)
into :new.iduser
from (select row_number() over (order by iduser) rn, iduser from users)
where iduser != rn


Z drugiej strony, co komu przeszkadzają dziury w numeracji... to tylko identyfikatory.

I myslisz, ze zadziala w taki sposob? :]

konto usunięte

Temat: Trigger-

Spróbuje jak wrócę z zajęć pokombinować z select mim(rn).

A czy nie wiecie może czy autoincreament w oraclu robi jakoś inaczej niż ja to zrobiłem?? dopiero co się przesiadłem z myslq do oracle i w mysql przy tworzeniu kolumny podawałem autoincreament i bylo ok.

konto usunięte

Temat: Trigger-

Marek Matuszewski:
A czy nie wiecie może czy autoincreament w oraclu robi jakoś inaczej niż ja to zrobiłem??

Dobrze zrobiles, niestety nie ma odpowiednika mysqlowego autoincrement.

konto usunięte

Temat: Trigger-

Proszę podawać nazwę bazy, której dotyczy problem. Sporo ułatwia. Napisanie trigger w tytule nic nie mówi. Proszę przeczytać to:
http://www.goldenline.pl/forum/2034076/numerowanie-fv-...
Wydaje mi się, że problem jest podobny.
Monika A.

Monika A. programista

Temat: Trigger-

Oracle?
Hm... to może z pewną taką nieśmiałością zaproponuję coś takiego:


CREATE OR REPLACE TRIGGER ustal_id
BEFORE INSERT
ON tabela

FOR EACH ROW

BEGIN
SELECT
Min(nr) INTO :NEW.id
FROM
tabela t,
(SELECT LEVEL AS nr FROM dual CONNECT BY LEVEL <= (SELECT Max(id) + 1 FROM tabela)) n
WHERE t.id(+) = n.nr
AND t.id IS NULL;
END;

Monika M. edytował(a) ten post dnia 08.04.11 o godzinie 12:09

konto usunięte

Temat: Trigger-

Monika M.:
Oracle?
Hm... to może z pewną taką nieśmiałością zaproponuję coś takiego:

I myslisz, ze zadziala w taki sposob? :]

ORA-04091
Monika A.

Monika A. programista

Temat: Trigger-

Mam jakiegoś zmutowanego Oracla, bo mnie nie wyskakuje ;)

edit:

przy insert into tabela values... nie wyskakuje,
ale już przy insert into tabela select... tak, chlip :(Monika M. edytował(a) ten post dnia 18.04.11 o godzinie 15:35

konto usunięte

Temat: Trigger-

Ireneusz Ptak:
Łukasz Pluta:
To nie z sekwencji, tylko trzeba przeczesać tabelkę (niestety przy każdym wstawianym wierszu):

select min(rn)
into :new.iduser
from (select row_number() over (order by iduser) rn, iduser from users)
where iduser != rn


Z drugiej strony, co komu przeszkadzają dziury w numeracji... to tylko identyfikatory.

I myslisz, ze zadziala w taki sposob? :]

Masz rację, nie zadziała ;) A przynajmniej w postaci triggera - mutating table error.Łukasz Pluta edytował(a) ten post dnia 15.04.11 o godzinie 23:18

Temat: Trigger-

Zrób inaczej. Dobrze byłoby, gdybyś miał jakąś tabelę z parametrami.
1) Stwórz tam sobie parametr o nazwie free_id_twoja_tablica o wartości min(id) z tabeli docelowej.
2) W tablicy docelowej zakładasz trigger after insert/delete, który po wstawieniu/usunięciu wiersza sprawdza min(id) z tabeli docelowej i robi update ww. parametru.
3) Na triggerze na insert dajesz jako id wartość parametru.

Powinno działać, nie sprawdzałem, to tylko mój pomysł na szybko.
Tomasz Żak

Tomasz Żak projektant
oprogramowania

Temat: Trigger-

Monika M.:
Oracle?
Hm... to może z pewną taką nieśmiałością zaproponuję coś takiego:


CREATE OR REPLACE TRIGGER ustal_id
BEFORE INSERT
ON tabela

FOR EACH ROW

BEGIN
SELECT
Min(nr) INTO :NEW.id
FROM
tabela t,
(SELECT LEVEL AS nr FROM dual CONNECT BY LEVEL <= (SELECT [/quote]> [quote]Max(id) + 1 FROM tabela)) n
WHERE t.id(+) = n.nr
AND t.id IS NULL;
END;


Chyba za skomplikowane i nie optymalne, dodatkowo
dla tabeli z ok 4tys wierszy taka konstrukcja selecta powoduje komunikat :
ORA-30009: Not enough memory for CONNECT BY operation

Najlatwiej chyba tak:


CREATE OR REPLACE TRIGGER ustal_id
BEFORE INSERT ON tabela FOR EACH ROW
BEGIN

select min(b) into v_new_id
from
(select rownum b from tabela)
where
b not in
(select id from tabela);

--nic nie znaleziono (nie ma przerw w id-kach)
if v_new_id is null then
select max(id)+1 (lub jesli jest sekwencja sekw.nextval) into v_new_id from tabela;
end if;

:NEW.id:= v_new_id;
END;

Tomasz Żak edytował(a) ten post dnia 18.04.11 o godzinie 14:07
Monika A.

Monika A. programista

Temat: Trigger-

Tomasz Żak:

<ciach>

Obawiam się, że skończy się jak wszystkie dotychczas zaproponowane - ORA-04091 :)
Tomasz Żak

Tomasz Żak projektant
oprogramowania

Temat: Trigger-

Monika M.:
Tomasz Żak:

<ciach>

Obawiam się, że skończy się jak wszystkie dotychczas zaproponowane - ORA-04091 :)


Akurat to rozwiazanie dziala bez ORA-04091 :)

konto usunięte

Temat: Trigger-

Tomasz Żak:
Akurat to rozwiazanie dziala bez ORA-04091 :)

Kolejny magiczny Oracle?

konto usunięte

Temat: Trigger-

Monika M.:
Tomasz Żak:

<ciach>

Obawiam się, że skończy się jak wszystkie dotychczas zaproponowane - ORA-04091 :)
>
To co wcześniej podałem nie działało na Oracle, ale na 100% nie wywoła tego błędu. No więc, nie wszystkie.
Łukasz Kurowski

Łukasz Kurowski Usque Ad Finem

Temat: Trigger-

Michał Z.:
To co wcześniej podałem nie działało na Oracle, ale na 100% nie wywoła tego błędu. No więc, nie wszystkie.

Hmm, nie działa na Oracle i nie wywoła błędu ORA-04091... Kurde blacha, możesz mieć rację ;)!

konto usunięte

Temat: Trigger-

Hm, wersja 11 ma takie cudo jak compound trigger.

Pozwala na odpytanie tabeli o brakujące id BEFORE STATEMENT (bez mutating table error!), załadowanie ich do zmiennej na poziomie triggera, a następnie BEFORE INSERT uzupełnienie id dla kolejnych rekordów. Nie mam niestety pod ręką wersji 11 do potestowania :]

We wcześniejszych wersjach można zrobić protezę używając dwóch triggerów i pakietu na boku do zapisywania zmiennych, aczkolwiek trochę paskudne to będzie.

konto usunięte

Temat: Trigger-

Łukasz Kurowski:
Michał Z.:
To co wcześniej podałem nie działało na Oracle, ale na 100% nie wywoła tego błędu. No więc, nie wszystkie.

Hmm, nie działa na Oracle i nie wywoła błędu ORA-04091... Kurde blacha, możesz mieć rację ;)!

Normalnie - znać fachowca. :P Prawda ile to wniosło do
dyskusji? Wystarczy przeczytać i rozwiązanie gotowe!

Napisałem, że "nie działało", bo nie napisałem kodu pod
Oracle'a, który by wykorzystywał to rozwiązanie. Kolega
przeczytał "nie działa"... Nie widzę powodu, dla którego
miałoby "nie działać". Chętnie poznam.
Na 100% nie będzie ORA-04091 - z definicji. No, ale co ja
tam wiem... Widać są lepsi fachowcy.

W osobnej tabelce trzymam numerację, dokładniej - aktualną
wartość licznika. Trigger, robi "select for update" na tej
drugiej tabelce. Reszta chyba oczywista. Jak by ktoś znowu
czegoś nie doczytał - link był wcześniej.

W zasadzie, zostaje problem z dziurami w numeracji, które
powstały później... Czyli ktoś wystawił fakturę, ale ona
nie poszła do klienta, i teraz chce, żeby w to miejsce
"wpadło" coś innego. No, ale wtedy takie rzeczy udało mi
się użytkownikom wyperswadować.

Zna ktoś inne rozwiązanie? Dobra na 11 jest "before
statement", a na 10?

Następna dyskusja:

MySQL trigger prosze o pomoc




Wyślij zaproszenie do