Trigger Problem Ora8.i/utl_file.Fopen

Hi

ich arbeite zur Zeit an einer Oracle 8.i Datenbank und habe dort einen Trigger erstellt der mit hilfe von utl_file.Fopen etwas aus einer Datei auslesen soll.
Zu Testzwecken habe ich in der ora.ini utl_file_dir = * eingestellt (das werde ich aber sobald es funktioniert ändern)
Der pl/sql Trigger kompiliert erfolgreich.
Versuche ich nun via SQL*Plus den Update-Trigger auszulösen stürtzt die SQL*PLus Eingabe sang und klang los ab bzw liefert unter dem Windows Task-Manager keine Rückmeldung und läst sich auch nur über selbigen beenden.

Hoffe jemand kann mir helfen
Darnest

Hallo Darnest!

Versuch mal folgende Dinge rauszufinden:

  1. Stelle sicher, dass der Trigger keine Endlosrekursionen auslöst
  2. Funktioniert der Code im Trigger (d.h. baue Dir eine Prozedur, die zumindest fast das gleiche macht und führe die aus)
  3. Ist der Trigger mit einem anderen Clientprogramm problemlos auslösbar (und das Prog haut Dir dabei auch nicht ab)
  4. Am Schluss würde ich mal versuchen den Trigger schrittweise aufzubauen (d.h. Du machst mal aus dem ganzen Trigger einen einzigen Kommentar und fügst dann den Code schrittweise wieder ein - dann solltest Du recht einfach rausfinden, wo das Probelm entsteht)

Gruß,
TheBeast

P.S.: Eine kleine Anekdote aus meiner „Karriere“: Schritt 4) klingt toll, habe aber schon mal den Fall gehabt dass ich genau das gemacht habe und am Ende lief das identische Programm, das vorher einen SegFault produziert hatte fehlerfrei. War zuerst verwundert, habe dann viel später den Fehler im Compiler gefunden und konnt ihn auch nachvollziehen (war mit Informix-4GL auf UNIX im Jahre Schnee, fragt’s mich nimmer, wie das gegangen ist :wink:)

Versuch mal folgende Dinge rauszufinden:

  1. Stelle sicher, dass der Trigger keine Endlosrekursionen
    auslöst
  2. Funktioniert der Code im Trigger (d.h. baue Dir eine
    Prozedur, die zumindest fast das gleiche macht und führe die
    aus)
  3. Ist der Trigger mit einem anderen Clientprogramm problemlos
    auslösbar (und das Prog haut Dir dabei auch nicht ab)
  4. Am Schluss würde ich mal versuchen den Trigger schrittweise
    aufzubauen (d.h. Du machst mal aus dem ganzen Trigger einen
    einzigen Kommentar und fügst dann den Code schrittweise wieder
    ein - dann solltest Du recht einfach rausfinden, wo das
    Probelm entsteht)

Gruß,
TheBeast

P.S.: Eine kleine Anekdote aus meiner „Karriere“: Schritt 4)
klingt toll, habe aber schon mal den Fall gehabt dass ich
genau das gemacht habe und am Ende lief das identische
Programm, das vorher einen SegFault produziert hatte
fehlerfrei. War zuerst verwundert, habe dann viel später den
Fehler im Compiler gefunden und konnt ihn auch nachvollziehen
(war mit Informix-4GL auf UNIX im Jahre Schnee, fragt’s mich
nimmer, wie das gegangen ist :wink:)

Ja :wink: das mach ich schon die ganze Zeit, es verwundert mich halt immer wieder das eine Software die mehere tausend Euro koste keinen vernünftigen Editor besitzt. Ganz hilfreich sind auch immer Meldungen wie in Zeile xxx ist ein Fehler aufgetreten, wobei der ‚Editor‘ noch nicht mal Zeilennummern besitzt (zumindest kenne ich keine Option dort welche hinzubekommen). Von der Qualität der Fehlermeldungen mal ganz abgesehen.
Zurück zum eigentlichen Problem, ich hab jetzt den halben Tag mit rumprobieren zugebracht und folgende dinge sind mir dabei aufgestossen.

  • Oracle scheint ein grundsätzliches Problem mit Triggern zu haben die von ‚aussen‘ angestossen werden, das trift auch auf SQL*Plus zu.
  • aus irgendwelchen unerfindlcihen Gründen kann es passieren das Triggercode der korrekt ist nicht validiert wird. (ja auskommentieren und dumpcode einsetzen ala a:=‚a‘; wirkt wunder :wink: darauf bin ich auch irgendwann gestossen).
  • der interne Parser verkraftet nur 32767 Zeichen daher ist man auf extrene Programme angewiesen wenn man mehr verarbeiten muss (ist mir jetzt schon uzm 2. mal böse bei Oracle aufgefallen)

bis jetzt dachte ich das ich das mein File einfach in mehere zerlegen kann und dann ‚alten‘ pl/sql-code zum einlesen wieder verwenden kann. So wie es aussieht muss ich jetzt wohl doch das ganze extern realisieren bei drei stelligem Triggercode nicht umbedingt was ich mir gewünscht habe.

Darnest

  • Oracle scheint ein grundsätzliches Problem mit Triggern zu
    haben die von ‚aussen‘ angestossen werden, das trift auch auf
    SQL*Plus zu.

muss diesen Punkt korrigieren es geht doch *ascheaufmeinhaupt*

Darnest

Hallo Darnest!

Ja :wink: das mach ich schon die ganze Zeit, es verwundert mich
halt immer wieder das eine Software die mehere tausend Euro
koste keinen vernünftigen Editor besitzt. Ganz hilfreich sind
auch immer Meldungen wie in Zeile xxx ist ein Fehler
aufgetreten, wobei der ‚Editor‘ noch nicht mal Zeilennummern
besitzt (zumindest kenne ich keine Option dort welche
hinzubekommen).

Das ist, damit TOAD und Konsorten auch Geld verdienen :wink:

Von der Qualität der Fehlermeldungen mal ganz
abgesehen.

Und das ist, damit ich auch Geld verdiene (sonst könnte das ja jeder)

  • Oracle scheint ein grundsätzliches Problem mit Triggern zu
    haben die von ‚aussen‘ angestossen werden, das trift auch auf
    SQL*Plus zu.

Das versteh’ ich jetzt nicht wirklich. Meiner Meinung nach wird doch jeder handlesübliche Trigger von aussen angestossen (indem Du nämlich einen insert, update, delete oder was auch immer machst). Welche Trigger würdest Du als nicht von aussen angestossen betrachten?

  • aus irgendwelchen unerfindlcihen Gründen kann es passieren
    das Triggercode der korrekt ist nicht validiert wird. (ja
    auskommentieren und dumpcode einsetzen ala a:=‚a‘; wirkt
    wunder :wink: darauf bin ich auch irgendwann gestossen).

Du meinst du erstellst den Trigger, die DB akzeptiert klaglos, aber der Trigger wird nicht ausgeführt oder bringt Fehler bei der Ausführung (also syntaktische Fehler - dass eine erfolgreiche Compilierung noch nicht bedeutet dass du auch das gewünschte Resultat bekommst ist ja klar)? Das ist mir nämlich ehrlich gesagt auch noch nie passiert…

  • der interne Parser verkraftet nur 32767 Zeichen daher ist
    man auf extrene Programme angewiesen wenn man mehr verarbeiten
    muss (ist mir jetzt schon uzm 2. mal böse bei Oracle
    aufgefallen)

Die Grenze (sind’s wirklich 32K?) kenne ich schon, aber da kann man sich ja leicht helfen, indem man die Funktionalität in Packages, Procedures und Functions auslagert. Ist zwar immer noch lästig, aber mA nicht soooo schlimm.

bis jetzt dachte ich das ich das mein File einfach in mehere
zerlegen kann und dann ‚alten‘ pl/sql-code zum einlesen wieder
verwenden kann. So wie es aussieht muss ich jetzt wohl doch
das ganze extern realisieren bei drei stelligem Triggercode
nicht umbedingt was ich mir gewünscht habe.

Bin schon wieder ratlos. Was meinst du mit dreistelligem Triggercode? Die Grösse des Triggers? Und warum solltest Du „alten“ PL/SQL Code nicht wiederverwenden können? Einfach den Aufruf der entsprechenden Prozedur in den Trigger rein und ab geht die Post. Oder meinst Du da ganz was anderes?

Gruss,
TheBeast *derjetztmalmehrfragenalsantwortenhat*

hi ihr zwei!

Das ist, damit TOAD und Konsorten auch Geld verdienen :wink:

a) das ist doch quest!
b) wehe! noch ein böses wort über toad! :wink:

Von der Qualität der Fehlermeldungen mal ganz
abgesehen.

Und das ist, damit ich auch Geld verdiene (sonst könnte das ja
jeder)

meine liebste fehlermeldung: „error in line -1“

Die Grenze (sind’s wirklich 32K?) kenne ich schon, aber da
kann man sich ja leicht helfen, indem man die Funktionalität
in Packages, Procedures und Functions auslagert. Ist zwar
immer noch lästig, aber mA nicht soooo schlimm.

JA! und man kann darin globale variablen definieren!! (scheint sich jetzt irgendwie schmutzig anzuhören, aber es kann teilweise schon seeeehr helfen - vor allem wenn sich die trigger gegenseitig ständig auslösen -> könnte es daran vielleicht scheitern?)

grüße,
tomh

Schlussendlich habe ich es doch noch hinbekommen.
Danke hier nochaml an alle die geholfen haben/helfen wollten.
Am meinsten hat wahrscheinlich geholfen nicht ständig auf
Programmcode zu schauen und mal bissel Frust loszuschreiben.

nun noch schnell ein paar klärende Worte:

Ja :wink: das mach ich schon die ganze Zeit, es verwundert mich
halt immer wieder das eine Software die mehere tausend Euro
koste keinen vernünftigen Editor besitzt. Ganz hilfreich sind
auch immer Meldungen wie in Zeile xxx ist ein Fehler
aufgetreten, wobei der ‚Editor‘ noch nicht mal Zeilennummern
besitzt (zumindest kenne ich keine Option dort welche
hinzubekommen).

Das ist, damit TOAD und Konsorten auch Geld verdienen :wink:

:wink:

Von der Qualität der Fehlermeldungen mal ganz
abgesehen.

Und das ist, damit ich auch Geld verdiene (sonst könnte das ja
jeder)

hehe ja hast recht ist ja schliesslich auch mein Lebensunterhalt

  • Oracle scheint ein grundsätzliches Problem mit Triggern zu
    haben die von ‚aussen‘ angestossen werden, das trift auch auf
    SQL*Plus zu.

Das versteh’ ich jetzt nicht wirklich. Meiner Meinung nach
wird doch jeder handlesübliche Trigger von aussen angestossen
(indem Du nämlich einen insert, update, delete oder was auch
immer machst). Welche Trigger würdest Du als nicht von aussen
angestossen betrachten?

irgendwo sagte ich schon das ich mich in diesem Punkt geirrt habe
und alles zurück nehme und ab jetzt das gegenteil behaupte :stuck_out_tongue:

  • aus irgendwelchen unerfindlcihen Gründen kann es passieren
    das Triggercode der korrekt ist nicht validiert wird. (ja
    auskommentieren und dumpcode einsetzen ala a:=‚a‘; wirkt
    wunder :wink: darauf bin ich auch irgendwann gestossen).

Du meinst du erstellst den Trigger, die DB akzeptiert klaglos,
aber der Trigger wird nicht ausgeführt oder bringt Fehler bei
der Ausführung (also syntaktische Fehler - dass eine
erfolgreiche Compilierung noch nicht bedeutet dass du auch das
gewünschte Resultat bekommst ist ja klar)? Das ist mir nämlich
ehrlich gesagt auch noch nie passiert…

nein ich habe einen Trigger der validiert ist dann füge ich eine
Zeile ein oder ändere etwas in eine und der trigger validiert nicht
mehr (soweit kann ich damit leben wenn mein Code tatsächlcih einen
Fehler enthält). Nehme ich dann wieder den fehlerhaften teil raus,
stelle also den Urzustand des Triggers wieder her validiert dieser
nicht mehr. kommentiere ich dann sämtliczhen Code aus und setze
Dumpcode ein (ala a:=‚a‘) validiert der Trigger wieder beim
compilieren. Füge ich nun den alten Triggercode wieder ein, sprich nehme ich die Kommentarzeichen wieder weg compiliert er wieder.
Dieses Phänomen hatte ich schon mehrmals.
Das der Trigger von anfang an nicht umbedingt das macht was er soll
ist klar :wink: try-n-error

  • der interne Parser verkraftet nur 32767 Zeichen daher ist
    man auf extrene Programme angewiesen wenn man mehr verarbeiten
    muss (ist mir jetzt schon uzm 2. mal böse bei Oracle
    aufgefallen)

Die Grenze (sind’s wirklich 32K?) kenne ich schon, aber da
kann man sich ja leicht helfen, indem man die Funktionalität
in Packages, Procedures und Functions auslagert. Ist zwar
immer noch lästig, aber mA nicht soooo schlimm.

Klar aber ich hab nicht umbedingt den Überblick wieviele Packages
davon betroffen sind und wollte halt später keine Überraschungen
erleben.

bis jetzt dachte ich das ich das mein File einfach in mehere
zerlegen kann und dann ‚alten‘ pl/sql-code zum einlesen wieder
verwenden kann. So wie es aussieht muss ich jetzt wohl doch
das ganze extern realisieren bei drei stelligem Triggercode
nicht umbedingt was ich mir gewünscht habe.

Bin schon wieder ratlos. Was meinst du mit dreistelligem
Triggercode? Die Grösse des Triggers? Und warum solltest Du
„alten“ PL/SQL Code nicht wiederverwenden können? Einfach den
Aufruf der entsprechenden Prozedur in den Trigger rein und ab
geht die Post. Oder meinst Du da ganz was anderes?

ich habe mich wohl tatsächlich etwas ungenau ausgedrückt, ja ich
meinte die Zeilenanzahl. Da ich bis dato dachte das irgendwas mit
dem Trigger anstossen nicht richtig funktioniert habe ich halt
angenommen den Trigger komplett neu schreiben zu müssen (halt in
einem extrenen Programm).

Gruss,
TheBeast *derjetztmalmehrfragenalsantwortenhat*

*aufdieschulterklopf* hast mir trotzdem geholfen und wenn es wirklich
nur mal daran gelegen hat nicht auf den Triggercode zu starren. :smile:

Achja im überigen hat es an einem nicht geschlossen Filehandle
gelegen was ich die ganze Zeit übersehen habe, nur kurz als Lösung
des Problems :wink:

Darnest
möge der Compiler mit euch sein :wink:

Schlussendlich habe ich es doch noch hinbekommen.
Danke hier nochaml an alle die geholfen haben/helfen wollten.
Am meinsten hat wahrscheinlich geholfen nicht ständig auf
Programmcode zu schauen und mal bissel Frust loszuschreiben.

Na das ist ja mal das Wichtigste…

Klar aber ich hab nicht umbedingt den Überblick wieviele
Packages
davon betroffen sind und wollte halt später keine
Überraschungen
erleben.

Diesbezüglich vertraue ich immer mal einfach Oracle und sehe mir die Dependencies einzelner Module an. Damit hast DU zumindest schon eine Liste der Codeteile, die potentiell von einer Änderung betroffen sind. Und wenn’s nicht gerade Produktivdatenbanken sind kann man ja immer noch einfach ändern und dann schauen, was danach nimmer geht :wink:

*aufdieschulterklopf* hast mir trotzdem geholfen und wenn es
wirklich
nur mal daran gelegen hat nicht auf den Triggercode zu
starren. :smile:

Hauptsache es hat geholfen, und wenn’s an meinen schönen blauen Augen liegt *ggg* (die ganz nebenbei braun sind, aber ich gehe davon aus, dass das hier ja ohnehin keinen interessiert)

Achja im überigen hat es an einem nicht geschlossen Filehandle
gelegen was ich die ganze Zeit übersehen habe, nur kurz als
Lösung
des Problems :wink:

So ein böser Junge aber auch, lässt da glatt einen File-Handle offen. Na wie soller da aber auch…

möge der Compiler mit euch sein :wink:

Und mit Deiner CPU!