2012-08-28 11 views
37

Próbowałem zrobić coś takiego, jak auto-inkrementacja w Oracle 11g Express i SQL Developer. Niewiele wiem o Oracle i jestem też nowym wyzwalaczem.Tworzenie wyzwalacza w Oracle Express

Próbowałem uruchomić to, ale nie wiem jak to zrobić poprawnie.

CREATE TABLE theschema.thetable 
(id NUMBER PRIMARY KEY, 
name VARCHAR2(30)); 

CREATE SEQUENCE theschema.test1_sequence 
START WITH 1 
INCREMENT BY 1; 

create or replace trigger insert_nums 
before insert on theschema.thetable 
for each row 
begin 
select test1_sequence.nextval into :new.id from dual; 
end; 
/

Kiedy próbuję stworzyć spust, otrzymuję ekran, który prosi mnie o pewne "powiązania". Okno dialogowe ma tylko jedno pole wyboru "null". Co to oznacza i jak zrobić skrypt, który działa poprawnie?

Jakieś środki ostrożności podczas robienia tego rodzaju "auto-inkrementacji"?

Enter binds

+0

Dodałem tag SQL-Developer, ponieważ ten kod wygląda dobrze; Prosi o wypełnienie zmiennej powiązania, więc zakładam, że jest pewne ustawienie, które trzeba wyłączyć ... Nie mam pojęcia co. – Ben

+1

BTW, od Oracle 11 można bezpośrednio odwoływać się do sekwencji. Oznacza to, że możesz napisać ': new.id: = test1_sequence.nextval' bez użycia SELECT. – Ben

+1

To samo pytanie tutaj! Dzięki za twój post! –

Odpowiedz

48

Wydaje się, że SQL Developer uważa, że ​​używasz zwykłego DML (manipulacja danych), a nie skrypt DDL (definicja danych). Uważa również, że :new.id jest zmienną wiążącą.

Dlaczego tak się dzieje, nie wiem; Nie mogę tego odtworzyć w Oracle SQL Developer 2.1.

Spróbuj otworzyć nowe okno arkusza SQL w schemacie theschema i wykonać „całość” skryptu (nie Statement), naciskając klawisz F5(nie F9).

+0

Dziękuję bardzo! to działa.Nie wiem, dlaczego cały skrypt musi zostać wykonany, aby to działanie działało prawidłowo. Dlaczego nie można tego zrobić po części. –

+0

Nie ma za co! Nie wiem, dlaczego tak się dzieje, ponieważ mój programista SQL działa dobrze. –

+1

Miałem dokładnie ten problem i to było rozwiązanie. Mogę potwierdzić Jest to związane z wersją SQL Developer. – Jhokva

15

W ten sposób rozwiązałem ten problem, wstaw "ustaw zdefiniuj;" przed poleceniem:

set define off; 
create or replace trigger [...] 
[...] 
end; 
/

Następnie wyróżnić zarówno komend i naciśnij klawisz F9, aby uruchomić. Lub możesz uruchomić wszystkie polecenia za pomocą F5.

Wygląda na to, że jeśli polecenia wykonywane są pojedynczo z klawiszem F9, ustawienie defin wyłączone nie ma wpływu.

+0

Brzmi to jak dobre rozwiązanie, ale byłoby lepiej, gdybyś wspomniał o tym, co właściwie robi "set define off". Z tego, co czytam, wydaje się, że wyłącza się monitowanie użytkownika o tego rodzaju powiązania z wartościami/wartościami? Dobrze wiedzieć. https://stackoverflow.com/questions/34332639/when-or-why-to-use-a-set-define-off-in-oracle-database – Balmipour

+0

Nie rozwiązuje to problemu w pytaniu. Zatrzymuje SQL Developer interpretując zmienne zastępcze (oznaczone przez ampersand, &), ale nie wpływa na traktowanie zmiennych wiązania (oznaczone dwukropkiem,:), o co pytano OP. –

0

Na moim przypadku, roztwór wpisując „newRow” dla „nowych” i „oldrow” do „starych” jako wartości wiąże się ...

+0

I działa! – m0rjjj

0

jestem nowicjuszem w tym więc miej to na uwadze Daję odpowiedź. Myślę, że problemem jest to, że kod

create or replace trigger insert_nums 
before insert on theschema.thetable 
for each row 
begin 
select test1_sequence.nextval into :new.id from dual; 
end; 

Czy faktycznie skrypt i nie prosta instrukcja SQL. Dlatego musisz uruchomić "Uruchom skrypt". Odkryłem, że gdy miałem otwarty arkusz roboczy w SQL Developer, że gdybym miał gdziekolwiek w arkuszu roboczym dowolny kod dla wyzwalacza jak powyżej, to nawet próbowałem uruchomić instrukcję, że programista SQL zajrzy do arkusza roboczego i spróbuje uruchomić scenariusz. Aby temu zapobiec, musiałem skomentować kod. Jeśli chciałbym uruchomić kod wyzwalacza, niż musiałem otworzyć nowy arkusz, umieść tam kod i wykonaj RUN SCRIPT.

Powiązane problemy