In deinem Beispiel wird ein Trigger verwendet. Das ist im Grunde nichts anderes als eine PL/SQL
Prozedur die zu einem bestimmten Ereignis ausgeführt wird. In diesem Fall hast du interne
Bind Variablen. D.h. es sind Variablen die von der PL/SQL Engine, also quasi in Datenbank
definiert werden.
Externe Bind Variablen kannst du im Grunde wie Konsolenparameter bei einem Schript oder einer EXE
sehen. Sie definierst du ausserhalb der Applikation und gibst sie beim starten mit. Bei uns heisst
dies: Wir definieren die Variablen in der SQL*Plus Session und nutzen sie in fertigen Prozeduren.
Dein Trigger feuert beim einfügen eines neuen Satzes in die Tabelle "Spiel". Oracle stellt dir in
einem Trigger automatisch ein paar Variablen zur Verfügung mit denen du im Trigger arbeiten kannst.
Dazu gehören u.a. die Werte die in die neue Zeile eingefügt werden sollen. In einem UPDATE Trigger
bekommst du sogar die Werte die vorher in der Zeile drin standen UND die Werte die jetzt rein sollen.
Die Variablen heissen genauso wie die Spalten der Tabelle, wie alsu nun den neuen vom alten
unterscheiden? => Mit :new.SPALTENNAME und
ld.SPALTENNAME.
In einem INSERT Trigger kann es natürlich nur :NEW geben, in einem DELETE TRIGGER nur :OLD. UPDATE
kennt sowohl :new, als auch
ld. Wie schon gesagt sind :new und
ld Sonderfälle und haben nix
mit "externen" Bind Variablen aus SQL*Plus zu tun.
Dein Trigger weisst der Variablen DAUER einen neuen Wert zu. sobald dieser größer als 20 wird.
Somit ist es in der Tabelle nicht möglich Spiele mit einer Dauer > 20 zu speichern. Man kann zwar
INSERTEN was man will, aber es wird vom Trigger immer auf 20 gesetzt, sobald die Zahl größer wird.
Nebenbei: hier wäre auch ein CHECK Constraint denkbar.