Zum Inhalt springen

Oracle 8i PL/SQL - seltsames Verhalten


Ganymed

Empfohlene Beiträge

Hallo zusammen,

ja ich habe mal wieder was seltsames gefunden, und hoffe, dass hier jemand sowas auch schon mal hatte.

Folgendes: Ich habe eine Funktion in PL/SQL geschrieben. Soweit so gut. Keine Kompilierungesfehler oder dergleichen. Syntaktisch alles in Ordnung.

Wenn ich das Ganze teste, dann bekomme ich für ein SQL-Statement kein Ergebnis und die Funktion wird mit einem Fehler beendet.

Wenn ich aber das SQL-Statement ohne die Funktion mit denen von der Funktion entsprechenden Werten alleine Teste, dann funktionierts :confused:

Den Code jetzt zu posten ist was kompliziert, weil die Tabellen recht umfangreich verknüpft sind. Ich versuchs mal an einem Beispiel zu erklären, was das deutlich machen soll:

"Funktionsausschnitt"

Select Name into vName

from tblPersonen

Where ID = Variable;

--> Variable hat zum Beispiel den Wert 1234, den übergebe ich der Funktion

--> Nach absetzen des Statements ist vName = 0

"SQL-Statement alleine"

Select Name

from tblPersonen

Where ID = 1234;

--> Ergibt meinen gewünschten Wert...

Ein Exeption Handling müsste ich nicht machen, denn das Ganze ist so gestrickt, dass ich immer einen Wert bekomme...

Versteht jemand das? Mal gehts und mal nicht!? Ich zerbrech mir schon stundenlang den Kopf darüber und komm zu keinem Ergebnis...

Gruß

Ganymed

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kannst Du mal die Fehlermeldung posten?

Ich hatte mal genau so ein Problem, das wurde ganz kompliziert gelöst, obwohl, wie es ja bei Dir auch ist, immer ein Wert zurückgegeben werden kann. Ich poste mal meinen Code, aber ich weiß nicht, ob Dir das weiterhilft. Kann sein, dass bei mir ein anderer Fehler auftrat als bei Dir. Aber mit diesem Code ist der Fehler dann nicht mehr aufgetreten.

function UmwandlungIdEmail(id in number)

return varchar2

is

cursor eAdresse( nID number)

is

select f.email

from mitarbeiter m, funktion f

where m.manr = nID

and m.refid = f.refid;

emailadresse eAdresse%ROWTYPE;

begin

open eAdresse (id);

fetch eAdresse into emailadresse;

if eAdresse%NOTFOUND then

htp.p('keine eMail-Adresse gefunden für ID='||id);

return('postmaster@xxx.de');

else

return (emailadresse.email);

end if;

exception

when no_data_found then

htp.p('keine eMail-Adresse gefunden für ID='||id);

return('postmaster@xxx.de');

end UmwandlungIdEmail;

Hoffe, dass Dir das weiterhilft.

Gruß dorti

Link zu diesem Kommentar
Auf anderen Seiten teilen

ORA-06503: PL/SQL: Function returned without value.

Das ist die Fehlermeldung.

Das Problem ist ja eigentlich, dass er die Meldung nur bei der Funktion bringt.

Setze ich das Statement (an der Stelle, wo er den Wert "0" -nicht NULL- liefert) ohne die Funktion ab, dann bekomme ich ja was ich will...

Nachtrag: Ne Exeption kann und darf ich gar nicht schreiben!

Es geht in meinem Problem um Preise und Artikel. Und ein Preis steht nie ohne Artikel da... :mod:

Du hast ja letztendlich den Fehler einfach abgefangen.

Aber es muss ein Ergbnis rauskommen. Nur halt einzeln kommsts raus... :confused:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Funktion liefert Dir den Wert 0 und meldet gleichzeitig einen Fehler? Das ist ja komisch... Bei mir kam der Fehler, ich denke, es war sogar der gleiche Fehler, aber die Funktion hat mir keine 0 oder sonstwas ausgespuckt.

Klar, hab ich den Fehler abgefangen, aber es gab keine ID-Spalte, der nicht auch eine Emailadresse zugeordnet war. Deswegen war das Abfangen des Fehlers eigentlich unnötig, aber die Datenbank wollte das so und nur so hab ich das Problem beseitigen können.

Gruß dorti

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von dorti

Die Funktion liefert Dir den Wert 0 und meldet gleichzeitig einen Fehler? Das ist ja komisch... Bei mir kam der Fehler, ich denke, es war sogar der gleiche Fehler, aber die Funktion hat mir keine 0 oder sonstwas ausgespuckt.

Klar, hab ich den Fehler abgefangen, aber es gab keine ID-Spalte, der nicht auch eine Emailadresse zugeordnet war. Deswegen war das Abfangen des Fehlers eigentlich unnötig, aber die Datenbank wollte das so und nur so hab ich das Problem beseitigen können.

Gruß dorti

Nein, nein :)

Die Funktion liefert 0 zurück - korrekt.

Und das ist ja genau der Fehler... :)

Ist halt die Frage, wie sowas kommen kann:confused:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von AxlHammer

Hast du in der Funktion nen RETURN-Statement? Wird dieses (oder ein anderes) RETURN-Statement ganz sicher ausgeführt? Vielleicht solltest du es dochmal mit ner Exception versuchen (vielleicht auch erstmal zum tetsen mit OTHERS, damit du siehst ob es daran lag...)

Gruss, Axl

Ja ich habe ein return-Statement.

Es wird ja nicht ausgeführt, weil er nichts findet.

Hmm... ich glaub mein Problem ist noch nicht ganz klar...

Also:

Ich habe einen Artikel. Dieser Artikel hat einen Preis. Die ID des Artikels übergebe ich meiner Funktion.

Mit Hilfe dieser ID soll der Preis ermittelt werden.

Es gibt immer einen Preis zu einem Artikel (Default 0,00 €).

Von daher muss mir mein SQL-Statement (vereinfacht)

Select ID into PreisID

from Preise

where aID = übergebene Variable

--> da muss jetzt eine ID als Wert rauskommen. Da aber keiner Kommt, habe ich 0 und die Funktion hat keinen Return Wert. --> Ergo diese Oracle Meldung.

Soweit klar? :)

Wenn ich aber dieses SQL-Statement einfach mal aus dieser Funktion herausnehme, ein SQL-Skript-Fenster aufmache und anstatt der Variable einen konkreten Wert (idealerweise den Wert, den die Funktion bekommt) eingebe, dann bekomme ich einen Wert.

Und das ist das kuriose an der Sache.

Warum findet er in meiner Funktion nichts, aber im SQL-Sktipt Fenster? Ich habe das exakte Statement (ohne das "into" versteht sich).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ah, jetzt ja...

Da du ja wahrscheinlich immer noch der gleiche Benutzer bist, würde ich vielleicht mal davon ausgehen dass irgendwas mit deinen Datentypen nicht stimmt, d.h. dass du vielleicht der Funktion einen NUMBER-Datentyp übergibst und dieser den dann als VARCHAR umwandelt oder so...

Kann das vielleicht sein?

Gruss, Axl

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ah, jetzt ja...

Da du ja wahrscheinlich immer noch der gleiche Benutzer bist, würde ich vielleicht mal davon ausgehen dass irgendwas mit deinen Datentypen nicht stimmt, d.h. dass du vielleicht der Funktion einen NUMBER-Datentyp übergibst und dieser den dann als VARCHAR umwandelt oder so...

Kann das vielleicht sein?

Gruss, Axl

Wie immer noch der gleiche User bin? :confused:

Nein, ich übergebe jedesmal nen Number-Wert...

PS: ne Eintagsfliege wars wohl auch nicht; habs nämlich immer noch :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also, um das Ganze jetzt mal aufzuklären:

Das Problem lag an meiner Variablen-Deklaration.

Eine Variable hieß genauso wie eine ID und deswegen ist PL/SQL durcheinander gekommen.

Witzigerweise hat man das im Testfenster nirgends gesehen!

Merke: immer einen anderen Präfix für Variablen verwenden als in der Datenbank

Hatte einmal numPrice (ID) und einmal numPrice (Variable). Nachdem ich aus dem einen numPrice ein vPrice (für Variable ;)) gamcht hatte, gings :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...