Trigger anlegen in Oracle 10g - Fehlerder IN- oder OUT-Parameter auf Index: 1

#1
Hallo,

wir haben bei uns in der Firma vor zwei Wochen einige Oracle-Datenbanken von der 9er auf die 10g migriert. Beim Testen ist uns ein schwerwiegender Fehler beim Anlegen von Triggern aufgefallen, der im Internet leider aber nur mehr als spärlich dokumentiert ist.

Deswegen poste ich das hier, falls jemand mal ähnliche Probleme hat und nach einer Lösung sucht.

Wenn man nun eine Oracle 10g Datenbank bzw. dem dazugehörigen 10g-Client hat, möchte man ja gegebenenfalls Trigger anlegen.

Das ist in der 10g-Version über den 10g Oracle-Client nicht möglich!

Ich habe ein entsprechendes Dokument als Anhang hinterlegt. Es handelt sich hierbei um den Fehler PLS-00049. Nun könnte man sich denken: "Hey, ich mache das über das Scratchpad und benutze nicht den Wizard". Das bringt allerdings genauso wenig.

Man bekommt immer dieselbe Fehlermeldung:

Code:
Fehlender IN- oder OUT-Paramenter auf Index: 1

Des Rätsels Lösung:

Ich verwende das Tool "Toad for Oracle in der Version 9.5.0.31". Man setzt also für eine Tabelle einen Primärschlüssel, legt eine entsprechende Sequenz an und mit folgendem Statement sollte das Anlegen eines Triggers unter 10g nun funktionieren:


Code:
CREATE OR REPLACE TRIGGER ORACLEUSER.TRIGGERNAME
BEFORE INSERT ON ORACLEUSER.TABELLENNAME
REFERENCING NEW AS New OLD AS Old FOR EACH ROW
BEGIN
 SELECT SEQUENZNAME.NEXTVAL INTO :New.PRIMAERSCHLUESSELID FROM DUAL;
END TRIGGERNAME;

Das kuriose ist: Die Migration von der 9er zu 10g-Datenbank hat einwandfrei funktioniert. Auch die bereits vorhandenen Trigger funktionieren und werden ohne Komilierfehler im Oracle 10g-Client angezeigt. Auch die neu mit Toad angelegten Trigger werden korrekt angezeigt.

Oracle selbst bestätigte hierzu, dass es sich um einen Bug handelt und dass es hierfür wohl vorerst keinen Patch geben wird.

Viele Grüße

Evil
 
#3
Klar machen die auch Fehler. Aber weil man so wenig darüber ließt bzw. es kaum Quellen zu dem Problem im Netz gibt, mach ich das hier publik, damit der Nächste mit demselben Problem net ne Woche lang rumprobieren muß, um dann irgendwann drauf zu kommen, dass es sich tatsächlich um einen Bug handelt.
 
Oben