Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Oracle 8i PL/SQL - seltsames Verhalten

Empfohlene Antworten

Veröffentlicht

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

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

  • Autor

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:

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

  • Autor
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:

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

  • Autor
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).

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

  • Autor
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

Tja, keine Ahnung voran das liegen könnte.

Am besten postet du mal den Quellcode, und am besten auch die Werte die du übergibst...

Gruss, Axl

  • Autor

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 :)

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.