Oracle: Sequence

flowerpower

Mitglied
Habe eine Tabelle Warenkorb (nur eine Übung für mich). Sinn ist es Sequencen (in Verbindung mit und ohne Triggern) zu verstehen.

Warenkorb:
ARTIKEL_ID NOT NULL NUMBER
ARTIKEL VARCHAR2(30)
ABTEILUNG VARCHAR2(30)
ANZAHL NUMBER

Sequence:

create sequence Warenkorb_Trigger_Seq start with 1 minvalue 1 maxvalue 20 increment by 1 nocycle order;

Dafür habe ich einen Trigger erstellt:

CREATE OR REPLACE
TRIGGER WARENKORB_TRIGGER_SEQ BEFORE INSERT ON WARENKORB
FOR EACH ROW
BEGIN
if :new.anzahl is null

then
SELECT sequence1.NEXTVAL INTO :NEW.anzahl FROM DUAL;
end if;
END;


bei eingeschaltetem Trigger:

insert into warenkorb values (44, 'fritz3', 'Video', null);

Funktioniert auch: die Sequence wird hochgezählt und eingetragen.


bei ausgeschaltetem Trigger, dachte ich mir, sollte es auch funktionieren, indem ich einfach den nächsten Wert der Sequence anspreche.

insert into warenkorb values (45, 'fritz4', 'Video', sequence1.nextval);

Das funktioniert jedoch nicht, mir wird hier ein null-Wert eingetragen.

Ist der Eintrag via sequence-Name.nextval nicht möglich, muss man das über Trigger realisieren?

Sequencen müssen doch nicht bei 1 beginnen und können beliebig ganzzahlig hochgezählt werden, oder? Zählen Sequencen eigentlich auch rückwärts, mir fällt spontan nichts Sinnvolles ein, wo man das brauchen könnte, aber man weiss ja nie.

Was heisst bei der Sequence-Erstellung 'order' (werden nicht diese generell incrementiert auf den nächsten Wert ausgegeben)?

Danke vorab für die Hilfe.

Grüsse. flowerpower

Update: mir ist gerade etwas aufgefallen, wenn ich den nextval als to_number caste (also der Typ der Spalte in der Tabelle), dann trägt er diesen auch in die Tabelle ein.

insert into warenkorb values (315, 'Milch1', 'Lebensmittel', to_number(sequence1.nextval));

Ist es etwa so, dass der nextval einer Sequence ein Character ist? Ich dachte, dass sei für SQL ein Number?
 
Zuletzt bearbeitet:
Ist der Eintrag via sequence-Name.nextval nicht möglich, muss man das über Trigger realisieren?

Eigentlich schon. Ich kann leider nicht ganz nachvollziehen warum es bei dir nur über ein Cast mit TO_NUMBER funktioniert... ist mir ehrlich gesagt neu. Du hast auch sicher keine "'" in deinem Statementund der Datentyp der Tabelle ist auch wirklich NUMBER ?:confused:

Der NULL Wert könnte evtl daher kommen dass die SEQUENCE den MAXVALUE erreicht hat? Biste schon bei 20 Einträgen?

Sequencen müssen doch nicht bei 1 beginnen und können beliebig ganzzahlig hochgezählt werden, oder?
Zur Konfiguration gibts die Parameter "START WITH n" und "INCREMENT BY n". Damit kann der Startwert und der jeweilige Sprung konfiguriert werden.

Zählen Sequencen eigentlich auch rückwärts, mir fällt spontan nichts Sinnvolles ein, wo man das brauchen könnte, aber man weiss ja nie.
Nö geht nur mit einem Workaraound indem ich z.B. den Sequencewert immer von einer Konstanten =MAXVALUE d. Sequence abziehe ;-)

Was heisst bei der Sequence-Erstellung 'order' (werden nicht diese generell incrementiert auf den nächsten Wert ausgegeben)?
Sequencen sind normalerweise immer sortiert, d.h. in der Reihenfolge der Abfrage werden die Zahlen inkrementiert. Bei RAC Umgebungen also geclusterten Datenbanken hält jede Instanz eine Menge von Zahlen der Sequence und vergibt diese an die Clients (CACHE Parameter)
Mit der Option ORDER wird sichergestellt, dass auch über geclusterte System die Sequenzen exakt nach der Reihenfolge der Abfragen vergeben werden.
Für "normale" Standalone Datenbanken ist der Parameter unrelevant.
 
Habe einen desc auf die Tabelle warenkorb oben eingefügt gehabt und alle Statements 1:1 eingefügt. Datenbank ist Oracle 10.2.0.1.0.

Anzahl ist in der Tat number.

Ansonsten wie immer vielen Dank für deine Hilfe. Schnell, präzise und fachkundig.
Alles sehr schön und bitte so weiter machen. ;-)

Ich erstelle die Tabelle nochmal auf einer Oracle 9i. Mal sehen was die hergibt.

Grüsse. flowerpower
 
Habs jetzt mal nachvollzogen und verstehs aber immer noch nicht.. ;-)

SQL:
SQL> conn test/test
Connect durchgefuhrt.

SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

SQL> desc test;
 Name                                      Null?    Typ
 ----------------------------------------- -------- ----------------------------
 TEXT                                      NOT NULL VARCHAR2(50)

SQL> alter table test add anzahl number;

Tabelle wurde geandert.

SQL> desc test
 Name                                      Null?    Typ
 ----------------------------------------- -------- ----------------------------
 TEXT                                      NOT NULL VARCHAR2(50)
 ANZAHL                                             NUMBER

SQL> create sequence Warenkorb_Trigger_Seq start with 1 minvalue 1 maxvalue 20 increment by 1 nocycle order;

Sequence wurde erstellt.

SQL> insert into test values( 'Hallo Welt', Warenkorb_Trigger_Seq.NEXTVAL );

1 Zeile wurde erstellt.

SQL> select * from test;

TEXT                                                   ANZAHL
-------------------------------------------------- ----------
Hallo Welt                                                  1
 
Zuletzt bearbeitet von einem Moderator:
Hmm, bin da auch überfragt. Vielleicht liegt es an Oracle. Habe die DB selbst aufgesetzt, nach festem beschriebenen Schemata.

Ich bin mit meinem Oracle-Latein jedenfalls schon am Ende, wenn Du dann nicht weisst, woran es liegt - wer sonst sollte es wissen. :)

Muss am Montag fit in Oracle sein, da ist meine 2. Nachklausur.
... man ist mir schlecht, wenn ich daran denke. ;(

Dennoch vielen Dank.

Grüsse. flowerpower
 
Habe eben deine Testtabelle genommen und da hat es auch funktioniert.
... nun gut, wird wohl irgendwo der Wurm drin sein in der Tabelle, obwohl die Spalte vom Typ number war ...

Jedenfalls klappt es auch ohne das casting.

Danke.

Grüsse. flowerpower
 

Neue Beiträge

Zurück