Am 19.07.2012 14:48, schrieb
seiler....@googlemail.com:
>
>> 1) daf�r sorgen da� alle Daten sich an die gleichen Konventionen halten
>> 2) im Package mittels EXECUTE IMMEDIATE "ALTER SESSION SET NLS_... = ..." das
>> richtige NLS_ENVIRONMENT setzen
>
> Hallo Peter,
>
> danke f�r Deine schnelle Antwort.
> Habe den PL/SQL Block im Scheduler wie folgt ge�ndert, leider ohne Erfolg.
>
> BEGIN
> EXECUTE IMMEDIATE 'ALTER Session SET Nls_Numeric_Characters = German';
> Package.Prozedur;
> END;
Nein. Neinneinnein.
Das ist kein Parameter, der "macht das alles wieder geht".
Du sollst erst deine Daten analysieren um zu verstehen, was die Ursache des
Problems ist, und warum du das genau jetzt bekommst, und vorher offensichtlich
nicht.
Au�erdem hast du die Syntax f�r den Parameterwert falsch.
Die Fehlermeldung tritt bei der Konvertierung von Character Spalten mittels
to_number auf. Mit der falschen Wahl des Felddatentypes fangen die Probleme
dann halt an, und dann mu� man eben leiden.
Was die Datenkonstellation angeht gibt es mehrere M�glichkeiten:
- du hattest bisher in der/den betroffenen Spalten nur Integerwerte, aber
jetzt auf einmal nicht mehr, sondern neuerdings Dezimalstellen, allerdings
nicht mit dem erwarteten Dezimaltrenner.
- du hattest bisher nur Integerwerte und keine Gruppen/Tausendertrennzeichen,
aber jetzt auf einmal Integerwerte MIT Gruppen/Tausendertrenner
- beides auf einmal
Wenn ja: warum? Darf das, ist das richtig so? Wenn nicht, wo kommen die Daten
her? Kommen irgendwelche Schrottdaten �ber irgendwelche Schnittstellen,
Fremdapplikationen in die DB? Schreibt jemand Daten in die beteiligten
Tabellen der nicht wei� was er da tut? Sabotage?
Wenn das so oder so �hnlich ist, dann besteht auch die Gefahr, da�, obwohl es
sich (von der Intention her) um Integers mit Tausendertrenner handelt, die
Zahlen als solche mit Dezimalstellen fehlinterpretiert werden, und du somit
Daten mit Fehlerfaktor von 3-6 Zehnerpotenzen in deiner DB hast.
Was soll z.B. der String '120,235' repr�sentieren? Das kann genau so gut
einhundert komma zwei drei f�nf darstellen wie auch
einhunderttausendzweihundertf�nfunddrei�ig. Das ist eine Frage der Konvention,
und wenn man die Einhaltung bestimmter Konventionen nicht erzwingen kann, dann
hat man halt zweifelhafte oder inkonsistente Daten in der DB.
Nur wenn du genau wei�t, was Sache ist mit deinen Daten, dann kannst du ggf.
eine der skizzierten L�sungsm�glichkeiten verwenden.
Wenn du z.B. f�r die Session des Scheduler Jobs festlegen willst, da� '.' der
Gruppentrenner ist, und ',' der Dezimaltrenner, dann w�re der richtige Befehl
in deinem PL/SQL Code oben:
BEGIN
...
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ",."';
...
END;
Syntax und Semantik siehe
http://goo.gl/EbE9h
http://goo.gl/wxr1Q
http://goo.gl/pZPF8
Besser w�re es allerdings, von vornherein immer den richtigen Felddatentyp zu
w�hlen, und Zahlen auch nur in passend dimensionierten NUMBER-Feldern
abzuspeichern.
Deine Probleme m�cht ich nicht haben ;-)