Autor Beitrag
mambo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76

Win XP
D6 Prof
BeitragVerfasst: Mi 04.12.02 09:16 
Hallo !

Ich habe ein großes Problem:
Ich habe eine Stored Procedure in Oracle geschrieben, die ich gerne von Delphi aus mit Parametern starten würde.
Mit der ODAC-Komponente TOraStoredProc eigentlich kein Problem, habe ich ja öfter schon gemacht. Nun habe ich aber eine Funktion in der Prozedur die einen Stringwert in eine Zahl umwandelt.
ausblenden Quelltext
1:
SELECT TO_NUMBER(STRINGWERT) INTO V_COEFFICIENTE FROM IPV.TFR_COSTANTI WHERE CODICE=1;					


wobei ich V_COEFFICIENTE als number deklariert habe. Der STRINGWERT, der umgewandelt werden muss, ist 6,91.
In Oracle funktioniert das auch super, und die Prozedur läuft ohne Fehler, aber wenn ich sie von Delphi aus starten will, dann kommt der Fehler: Invalid Number. Delphi will die Zahlen mit "." und nicht mit "," als Kommastelle. Wie kann ich solche Fehler vermeiden???

Danke
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Mi 04.12.02 10:23 
Hi
das verstehe ich nicht so recht. Die Prozedur ist in der Datenbank und läuft auch dort ab. Delphi hat damit keinerlei Einfluss auf die Abarbeitung. Über eventuelle Parameter oder Rückgabewerte hast du ja leider nix geschrieben, aber wenn du einen String übergibst dann kanns dabei doch eigentlich keine Probleme geben.

Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
mambo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76

Win XP
D6 Prof
BeitragVerfasst: Mi 04.12.02 10:28 
ich verstehe das ja auch nicht...
aber es ist wirklich so...
vielleicht nimmt Delphi andere Ländereinstellungen oder Charsets???
hab schon alles probiert.
wenn die Zahl (im String) z.B. 9,19 mit Komma ist, dann funktioniert die Prozedur in Oracle, aber von Delphi aus nicht, und wenn ich die Zahl in das Stringfeld als 9.19 mit Punkt eingebe, funktioniert die Prozedur in Delphi, aber in Oracle nicht. Immer der gleiche Fehler: Invalid Number.

was will man da machen...
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Mi 04.12.02 10:31 
Hi
Wird denn der Stringwert von Delphi aus an die Prozedur übergeben? Dann könntest du ja als letzte Möglichkeit dafür sorgen, dass das Dezimalzeichen entsprechend umgewandelt wird.

Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
mambo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76

Win XP
D6 Prof
BeitragVerfasst: Mi 04.12.02 10:36 
eben nicht !
der Stringwert wird IN DER PROZEDUR von einer Tabelle ausgelesen. Das ist ja das unverständliche...
Alfons-G
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 307

Win XP Prof, Linux, Win 7
D5 Prof, D7 Architect, D2005 Architect, D2007 Architect
BeitragVerfasst: Mi 04.12.02 12:01 
Du hast also in Deiner Tabelle Zahlen als Strings gespeichert, z.B. '6,91'.
Wenn Du jetzt in der Prozedur diesen String in eine Zahl umwandelst, richtet sich Oracle nach den Ländereinstellungen des DB-Servers.

Nachdem Oracle 6,91 als gültige Zahl interpretiert, sind dort alse die Einstellungen für Deutschland aktiv. Oracle wandelt also den String '6,91' in die Zahl 6,91 um. Jetzt gibst Du diese Zahl als Parameter an das aufrufende Programm zurück. Delphi bekommt also 6,91 als Ergebnis. Dies ist für Delphi aber keine gültige Zahl, um keinen Fehler zu erhalten, müsste das Ergebnis 6.91 lauten. Das wiederum kann Oracle aber nicht als Zahl liefern, ohne dass Die Serverumgebung auf amerikanische Zahlenformate eingestellt wird.

Falls Du diesen Wert in der Stored Procedure nicht weiterverarbeitest, kannst Du ihn als String auslesen und in einem String-Parameter an Delphi übergeben. Hier kannst Du den Wert in eine Zahl umwandeln.

Falls Du mit dem Wert auch in Oracle rechnen musst, könntest Du ihn mit TO_CHAR wieder zurückverwandeln.

Dieses Problem hast Du übrigens auch, wenn Du Daten von Oracle (deutsch) nach MS Access (deutsch) und umgekehrt exportierst. Obwohl ein deutsches Access Zahlen mit Komma darstellt, verwendet Microsoft intern den Dezimalpunkt. Deshalb werden Gleitkommazahlen bei der Konvertierung immer in Strings umgewandelt, da sich beide Datenbanken mit ihrem Zahlenformat nicht verstehen.

:think:

_________________
Alfons Grünewald