simsalabim Geschrieben 27. April 2009 Teilen Geschrieben 27. April 2009 Hallo, ich habe ein kleines Problem, und finde dazu im Netz leider keine passende Lösung. Also ich habe eine Tabelle, die enthält 5 Attribute. alle attribute sind im Format VARCHAR2(2000 BYTE). Achso, es handelt sich um eine Oracle Datenbank. In dieser Tabelle gibt es ein Feld Menge, welöches mit Werten wiefolgt gefüllt ist: Beispiel: 9999.000 9.916 Diese Werte sollen jetzt in ein andere Tabelle gesinserted werden. Deises Feld hat allerdings den Datentyp number (10,2). Wie bekomme ich bitte dieses Feld jetzt konvertiert. Alles was ich bisher probiert hat ist fehlgeschlagen. Ich kenn zwar die Funktion to_number, allerdings weiß ich sie nicht recht anzuwenden. Wenn ich die Funktion so verwende funbktioniert sie nicht. Beispiel: to_number(Menge) oder to_number('Menge') Fehlt mir hier ein parameter, oder geht das so in der Form gar nicht Danke Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dbwizard Geschrieben 27. April 2009 Teilen Geschrieben 27. April 2009 (bearbeitet) Hallo, ich habe ein kleines Problem, und finde dazu im Netz leider keine passende Lösung. Also ich habe eine Tabelle, die enthält 5 Attribute. alle attribute sind im Format VARCHAR2(2000 BYTE). Achso, es handelt sich um eine Oracle Datenbank. In dieser Tabelle gibt es ein Feld Menge, welöches mit Werten wiefolgt gefüllt ist: Beispiel: 9999.000 9.916 Diese Werte sollen jetzt in ein andere Tabelle gesinserted werden. Deises Feld hat allerdings den Datentyp number (10,2). Wie bekomme ich bitte dieses Feld jetzt konvertiert. Alles was ich bisher probiert hat ist fehlgeschlagen. Ich kenn zwar die Funktion to_number, allerdings weiß ich sie nicht recht anzuwenden. Wenn ich die Funktion so verwende funbktioniert sie nicht. Beispiel: to_number(Menge) oder to_number('Menge') Fehlt mir hier ein parameter, oder geht das so in der Form gar nicht Danke Hallo, du kannst dies hier probieren : CREATE TABLE number_in_varchar_ii (this_is_a_number VARCHAR2 (50 BYTE)); INSERT INTO number_in_varchar_ii VALUES ( '12' ); INSERT INTO number_in_varchar_ii VALUES ( '13' ); INSERT INTO number_in_varchar_ii VALUES ( '14,3' ); INSERT INTO number_in_varchar_ii VALUES ( 'A1' ); INSERT INTO number_in_varchar_ii VALUES ( '23,34a' ); INSERT INTO number_in_varchar_ii VALUES ( NULL ); SELECT this_is_a_number, TO_NUMBER (XMLQUERY ('number($X)' PASSING this_is_a_number AS x RETURNING CONTENT)) n FROM number_in_varchar_ii; THIS_IS_A_NUMBER N ---------------- ------------------ 12 12 13 13 14,3 14.300000000000001 A1 23,34a Gruss Bearbeitet 27. April 2009 von dbwizard Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
simsalabim Geschrieben 27. April 2009 Autor Teilen Geschrieben 27. April 2009 (bearbeitet) Hallo, ist das so richtig? Habe deine Ändeurng übersehen. Hm das sieht mir aber nach einem großen konstrukt aus. ich brauch das eher recht einfach. Ich habe wie gesagt eine Tabelle, aus der ich täglich die Daten von a nach b schaufeln muß. Leider bekommen wir die Daten nur im String format geliefert, müssen diese aber zur Weiteren verarbeitung aber in eine zahl umwandeln. Gehrt das nicht einfacher? Bearbeitet 27. April 2009 von simsalabim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dbwizard Geschrieben 27. April 2009 Teilen Geschrieben 27. April 2009 Hallo, ist das so richtig? SELECT Menge, TO_NUMBER (XMLQUERY ('number(Menge)' PASSING Menge AS Menge RETURNING CONTENT)) n FROM stage.bom; Da kommt bei mir ne Fehlermeldung. Sorry, aber ich totaler Oracle Neuling Danke SELECT Menge, TO_NUMBER (XMLQUERY ('number($X)' PASSING Menge AS x RETURNING CONTENT)) n FROM stage.bom; - Das Menge kannst du natürlich im SELECT Teil weglassen, wenn du nur den konvertierten Wert (n) benötigst Gruss Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dbwizard Geschrieben 27. April 2009 Teilen Geschrieben 27. April 2009 Hallo, ist das so richtig? Habe deine Ändeurng übersehen. Hm das sieht mir aber nach einem großen konstrukt aus. ich brauch das eher recht einfach. Ich habe wie gesagt eine Tabelle, aus der ich täglich die Daten von a nach b schaufeln muß. Leider bekommen wir die Daten nur im String format geliefert, müssen diese aber zur Weiteren verarbeitung aber in eine zahl umwandeln. Gehrt das nicht einfacher? - Das "Grosse" Konstrukt ist nur ein Beispiel...Der eigentlich Code-Teil (siehe unten) ist "klein"...Der Vorteil dieser Lösung mit dem XML Konstrukt ist,dass "Nicht-Konvertierbare" Werte einfach leegelassen werden und nicht mit einem ORA Fehler abbrechen Gruss Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
simsalabim Geschrieben 27. April 2009 Autor Teilen Geschrieben 27. April 2009 Hi, leide rist ,mir immer noch nicht klar wie das funktionieren soll. Also mein insertskript sieht wiefolgt aus insert into ARTIKELBEZIEHUNGEN ( PBEZ_PAR_PART_ID, PBEZ_PART_ID, PBEZ_TYP_ID, PBEZ_WERT, PBEZ_BESCHR, PBEZ_WERK_ID, PBEZ_ANZ_1, PBEZ_ANZ_2, PBEZ_STATUS, PBEZ_SYSTEM ) select MATNR, IDNRK, STLAL, MATNR, MATNR, WERKS, SORTF, MENGE, 'A', 'SAP' from Artikelbez.; commit; Im Feld Menge steht halt jetzt z.b. 99.00 oder 1234.00 Wie bekomme ich das jetzt relative infach umgewandelt? Kannst du mir die codezeile evtl. anpassen? danke danke Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dbwizard Geschrieben 27. April 2009 Teilen Geschrieben 27. April 2009 Hi, leide rist ,mir immer noch nicht klar wie das funktionieren soll. Kannst du mir die codezeile evtl. anpassen? danke danke insert into ARTIKELBEZIEHUNGEN ( PBEZ_PAR_PART_ID, PBEZ_PART_ID, PBEZ_TYP_ID, PBEZ_WERT, PBEZ_BESCHR, PBEZ_WERK_ID, PBEZ_ANZ_1, PBEZ_ANZ_2, PBEZ_STATUS, PBEZ_SYSTEM ) select MATNR, IDNRK, STLAL, MATNR, MATNR, WERKS, SORTF, TO_NUMBER (XMLQUERY ('number($X)'PASSING Menge AS x RETURNING CONTENT)) AS Neue_MENGE, 'A', 'SAP' from Artikelbez.; (Ungetestet...) Ausserdem...Bist du sicher, das deine Tabelle so heisst (mit dem Punkt) ? .... from Artikelbez.; .... Gruss Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
simsalabim Geschrieben 27. April 2009 Autor Teilen Geschrieben 27. April 2009 Hallo und danke vielmals Natürlich hast du recht, meine Tabelle heißt natürlich nicht so. danke schön, war ein Tippfehler. Habe allerdings eine Fehlermeldung erhalten: Error at Command Line:22 Column:45 Error report: SQL Error: ORA-00932: Inkonsistente Datentypen: - erwartet, - erhalten 00932. 00000 - "inconsistent datatypes: expected %s got %s" *Cause: *Action: Das ist genau die wichtige zeile, ich habe sie mal farblich markiert. insert into ARTIKELBEZIEHUNGEN ( PBEZ_PAR_PART_ID, PBEZ_PART_ID, PBEZ_TYP_ID, PBEZ_WERT, PBEZ_BESCHR, PBEZ_WERK_ID, PBEZ_ANZ_1, PBEZ_ANZ_2, PBEZ_STATUS, PBEZ_SYSTEM ) select MATNR, IDNRK, STLAL, MATNR, MATNR, WERKS, SORTF, [COLOR="Red"][B] TO_NUMBER (XMLQUERY ('number($X)'PASSING Menge AS x RETURNING CONTENT)) AS Neue_MENGE,[/B][/COLOR] 'A', 'SAP' from Artikelbez.; (Ungetestet...) Ausserdem...Bist du sicher, das deine Tabelle so heisst (mit dem Punkt) ? .... from Artikelbez.; .... Gruss Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dbwizard Geschrieben 27. April 2009 Teilen Geschrieben 27. April 2009 Hallo und danke vielmals Natürlich hast du recht, meine Tabelle heißt natürlich nicht so. danke schön, war ein Tippfehler. Habe allerdings eine Fehlermeldung erhalten: Error at Command Line:22 Column:45 Error report: SQL Error: ORA-00932: Inkonsistente Datentypen: - erwartet, - erhalten 00932. 00000 - "inconsistent datatypes: expected %s got %s" *Cause: *Action: Das ist genau die wichtige zeile, ich habe sie mal farblich markiert. ehemm..ich stelle die Frage natürlich etwas spät, aber welche Oracle- Version verwendest du ? Gruss Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
simsalabim Geschrieben 27. April 2009 Autor Teilen Geschrieben 27. April 2009 Hallo, ich glaube es sit die version Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production Hilft das weiter Gruß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dbwizard Geschrieben 27. April 2009 Teilen Geschrieben 27. April 2009 Hallo, ich glaube es sit die version Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production Hilft das weiter Gruß Was passiert, wenn du : select TO_NUMBER (XMLQUERY ('number($X)'PASSING Menge AS x RETURNING CONTENT)) AS Neue_MENGE from Artikelbez.; ausführst ? Gruss Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
simsalabim Geschrieben 27. April 2009 Autor Teilen Geschrieben 27. April 2009 Hallo, wenn ich nur den Select ausführe erhalte ich folgende fehlermeldung: Error starting at line 1 in command: select TO_NUMBER (XMLQUERY ('number($X)'PASSING Menge AS x RETURNING CONTENT)) AS Neue_MENGE from stage.bom Error at Command Line:2 Column:45 Error report: SQL Error: ORA-00932: Inkonsistente Datentypen: - erwartet, - erhalten 00932. 00000 - "inconsistent datatypes: expected %s got %s" *Cause: *Action: Gruß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 27. April 2009 Teilen Geschrieben 27. April 2009 Hi, Dein Problem ist der . und evtl. alphanummerische Zeichen in diesem Feld. XML in allen Ehren aber ich würd das einfach so machen: create table src ( src_col varchar2(2000)); create table dest (dest_col number(10,2)); begin [URL="http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_errlog.htm"]dbms_errlog.create_error_log[/URL]('DEST'); end; / insert into src values('123.456'); insert into src values('234.000007'); insert into src values('234.567'); insert into src values('10.bg'); insert into dest (dest_col) select to_number(replace(src_col,'.',',')) from src [URL="http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_9014.htm#BGBEIACB"]log errors into[/URL] err$_dest reject limit unlimited; select substr(src_col,1,10) from src; select * from dest; select * from err$_dest; Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
simsalabim Geschrieben 28. April 2009 Autor Teilen Geschrieben 28. April 2009 Hallo, danke für die Antwort. Zunächst möchte ich sagen, dass es in diesem Feld keine Alphanumerischen Daten gibt, wobei das feld allerdings ja als varchar deklariert ist. Es sind nur Werte darin, die mit einem Punkt getrennt sind. Gibt es wirtklich nichts einfacheres, diese werte in einen numerischen umzuwandeln? Oder hilft das, wenn ich mir die werte mit einem Komma trennen lasse? Danke Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
simsalabim Geschrieben 28. April 2009 Autor Teilen Geschrieben 28. April 2009 Hallo ihr, die Lösung ist doch recht einfach. Oracle ist es wohl egal was ankommt und wandelt die Daten automatsich um. Es reicht wohl ein einfaches to_number(Feldname) und der Käse ist gegessen. Das einzigste was mir jetzt noch fehlt ist, dass der Punkt durch ein Komma ersetzt wird. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
simsalabim Geschrieben 28. April 2009 Autor Teilen Geschrieben 28. April 2009 So, nun ist alles vollbarcht. Oracle macht doch alles selbstständig. Kommt ein wert im Varcharformat, wandelt dies Oracle selbstständig um. Eine Sache haeb ich allerdings noch auf dem herzen, ich wandle jetzt als das GTextfeld in eine Zahl um, damit die Zahl auch den Deutschen Konventionen entspricht habe ich zusätzlich die Funktionen replace eingesetzt, die mir den Punkt durch ein Komma ersetzt. Leider schneidet er nun die letzten beiden Stellen ab, bzw. läßt die Kommas weg, wenn die Nachkommastellen 00 betragen. Kann ich hier noch was einstellen, das er mir auf jeden Fall die Nachkommastellen anzeigt? Danke Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 28. April 2009 Teilen Geschrieben 28. April 2009 Jaja das passiert wenn man keine passenden Datenformate verwendet :cool: Kann ich hier noch was einstellen, das er mir auf jeden Fall die Nachkommastellen anzeigt? Du formatierst die Nummer nochmal in einen String um: SELECT TRIM(TO_CHAR(TO_NUMBER('1234,00'),'99999999.99')) FROM DUAL Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.