SQL: Elegante to_number() Prüfung gesucht

Hallo,

Ich suche eine elegante Möglichkeit, in einer Oracle-DB die Datensätze (varchar2) zu finden, welche sich NICHT in eine Zahl umwandeln lassen.

Geht das elegant in einem geschlossenen SQL oder muss ich unbedingt eine Funktion dafür schreiben und immer die Exception abfangen?

LG Wurzl

Hi!

Ich suche eine elegante Möglichkeit, in einer Oracle-DB die
Datensätze (varchar2) zu finden, welche sich NICHT in eine
Zahl umwandeln lassen.

Kannst Du mit der SQL-Funktion „translate“ was anfangen?

(Wobei Trennzeichen hier zum Problem werden könnten)

Geht das elegant in einem geschlossenen SQL oder muss ich
unbedingt eine Funktion dafür schreiben und immer die
Exception abfangen?

Irgendwann (bevor ich auf „translate“ stieß) schrub ich mir eine Funktion, die bei einem to_number in einer Exception ein FALSE retournierte - da wurden sogar Tausender- und Dezimaltrennzeichen in verschiedenen Ländereinstellungen berücksichtigt!).

Diese Funktion war in einem firmeneigenen Standardpackage drinnen (wo noch ein paar so ähnliche Sachen drinnen waren, wie z.B. Datumsüberprüfungen und so)

Grüße,
Tomh

Hi Tomh,

Danke für die Antwort.
Translate kenne ich, weiss aber gerade nicht, wie mir das weiterhelfen könnte, da es ja Zeichenketten in Zeichenketten umwandelt.
Ich will einen ganzen Sack voll Daten von varchar nach number konvertieren und würde natürlich gerne vorher wissen, welche Datensätze dabei Stress verursachen werden.
Meine Lösung ist, eine Prozedur zu schreiben, die ein ‚select to_number(…)‘ macht und dann im Exception-Zweig die Stresszwerge rausschreiben zu lassen.
Aber das ist Schufterei und ich mag eben elegante Lösungen viel lieber :smile:

Wurzl

Hi Tomh,

Aber das ist Schufterei und ich mag eben elegante Lösungen

viel lieber :smile:

Wurzl

Hallo,

Eventuell wäre Regular Expressions etwas für dich.

–> http://www.oracle.com/technology/oramag/webcolumns/2…

Gruss

Hi!

Translate kenne ich, weiss aber gerade nicht, wie mir das
weiterhelfen könnte, da es ja Zeichenketten in Zeichenketten
umwandelt.

declare
 zeichenkette varchar2(20); -- umzuwandelnde Zeichenkette
 x varchar2(20); -- Hilfsvariable
 y number; -- "Ziel"
begin
 ...
 x := rpad(translate(zeichenkette,'0123456789','0'),20,'0');
 if (x = '00000000000000000000') then
 y := to\_number(zeichenkette);
 else
 -- keine rein numerische Zeichenkette
 end if;
 ...
end;

Aber das ist Schufterei und ich mag eben elegante Lösungen
viel lieber :smile:

Naja, die Prüfung auf korrekte Zeichen wird trotzdem eine Schufterei bleiben …

Dazu noch eine Frage: Woher kommen diese Datensätze? Werden diese ev. mit dem SQL-Loader geladen? Denn dann kannst Du hier ja bereits ein BAD-File angeben und Du ersparst Dir alles …

Grüße,
Tomh

Hi Wurzl,

was du suchst, gibt es ab ORA 10R1 (oder 2). Das Statement, was du brauchst ist:

INSERT INTO
 tabelle
(column-liste)
VALUES / SUBSELECT
log errors into errlog\_tabelle ('errtag') reject limit unlimited;

Schau mal in der Doku nach 'log errors into ’ beim INSERT-Statement. Funktioniert leider nicht bei allen Fehlern (PK, Unique Constraints, Deferred Constr.), bei solchen trivialen Fehlern wie to_number() geht nicht aber schon. Kein perfomancefressender Aufruf einer PL/SQL-Funktion mehr nötig…

gruss
bernhard