Forum Stats

  • 3,768,738 Users
  • 2,252,843 Discussions
  • 7,874,704 Comments

Discussions

ORA-01406 bei Umlauten

steph0h
steph0h Member Posts: 119
edited Nov 13, 2019 7:57AM in Forms Gruppe

Im Rahmen der Migration von Forms 11g nach 12c sind wir hier auf ein interessantes Problem gestoßen: und zwar tritt unter bestimmten Bedingungen ein ORA-01406 (Spaltenwert abgeschnitten) auf.

Die zugrundeliegende Tabelle hat ein Textfeld das beispielsweise so definiert ist:

BEZEICHNUNG VARCHAR2(10 BYTE)

Darin ist zB folgender Wert gespeichert: "Hütte12345" - d.h. der String enthält einen Umlaut und ist voll aufgefüllt.

Gleich vorweg - der Fehler tritt mit folgenden Werten nicht auf:

"Hutte12345"

"Hütte1234"

Der Fehler trat in tabellenbasierten Blockattributen auf und konnte dort durch das explizite Setzen der Längensemantik behoben werden.

Allerdings gibt es da noch eine PLL-Funktion, wo der Fehler im Code auftritt - und hier ist die Sache nicht so einfach zu beheben:

FUNCTION get_fabr_row(iFabrNr varchar2)

RETURN is_fabrikate%rowtype

IS

     db_row is_fab%rowtype;   

BEGIN

  select * into db_row

  from is_fab

  where nr = iFabrNr;

  RETURN db_row;

END;

Hier tritt der Fehler unmittelbar beim Selektieren in die Recordvariable db_row auf!

Der Verdacht liegt natürlich nahe, dass es sich um ein NLS-Problem handelt.

Die Sache wird noch kompliziert dadurch, dass der Fehler am Entwicklungssystem nicht auftritt - allerdings am Testsystem schon. Und bei diesem habe ich leider keinen direkten Zugriff auf die Konfiguration - und habe auch keine Möglichkeit diese selbst zu kontrollieren. Bin da von einem Kollegen abhängig, der leider immer seltener verfügbar ist (ist schon in einem anderen Projekt und kann sich um das eigentlich gar nicht mehr kümmern etc. etc.)

Jetzt wäre es sehr hilfreich, hier von der Community Hinweise zu bekommen, in welche Richtung ich da schauen sollte. Wodurch kann dieses Verhalten ausgelöst werden?

Danke,

Stephan

Answers

  • Volker Deringer
    Volker Deringer Member Posts: 135 Blue Ribbon
    edited Nov 12, 2019 12:34PM

    Hallo Stephan,

    ich hatte mal ein ähnliches Problem in Zusammenhang mit einem Report.

    Ursache war letztendlich eine Type-Deklaration in einem Package, die im Report in PL/SQL verwendet wurde.

    Der Fehler trat auf, wenn die Datenbanken bzw. die Char-Semantik des Types beim Compilieren und beim Ausführen unterschiedlich waren

    (und zusätzlich die DEV-Datenbank einen UTF8-Zeichsensatz hatte und die Produktion noch einen 8-bit-Zeichensatz).

    Details müsste ich aber erst wieder nachschauen.

    Ich würde daher als erstes mal sicherstellen, dass der rowtype auf der DEV-Datenbank und auf TEST identisch ist,

    d.h. vor allem die varchar2-Spalten der Tabelle(?) IS_FAB identisch angelegt sind - BYTE vs. CHAR.

    Im Zweifel abfragen über USER_TAB_COLS und dort CHAR_USED ...

    Aber ohne Zugriff auf TEST .. ??

    Viel Erfolg!

    Volker

  • steph0h
    steph0h Member Posts: 119
    edited Nov 13, 2019 3:27AM

    Hallo Volker,

    Danke für die Antwort.

    Ich muss da etwas präzisieren: die Datenbank ist die gleiche - insoferne ist sichergestellt, dass auch die Tabellendefinition gleich ist :-)

    Und auf die Datenbank habe ich auch Zugriff.

    Worauf ich keinen direkten Zugriff habe ist die Konfiguration des Forms-Servers!

    Stephan

  • Volker Deringer
    Volker Deringer Member Posts: 135 Blue Ribbon
    edited Nov 13, 2019 4:03AM

    Hallo Stephan,

    ok, dann prüfe mal die verwendeten NLS-Einstellungen.

    Diese kannst du in deinem Forms-Modul abfragen mittels

    tool_env.get_var('NLS_LANG', lokale_variable1)

    tool_env.get_var('NLS_LENGTH_SEMANTICS', lokale_variable2)

    Gibt es da Unterschiede zwischen DEV und TEST?

    Grüße


    Volker

  • Frank Hoffmann
    Frank Hoffmann Member Posts: 796 Gold Badge
    edited Nov 13, 2019 4:47AM

    Hallo Zusammen,

    der NLS Parameter müsste auch über ein Buildin funktionieren:

    GET_APPLICATION_PROPERTY(USER_NLS_LANG);

    Gruß nach Freiburg und bis nächste Woche Volker...

    Frank

  • steph0h
    steph0h Member Posts: 119
    edited Nov 13, 2019 7:57AM

    Ok, das hat mir schon mal weitergeholfen:

    Am Entwicklungssystem läuft es mit GERMAN_GERMANY.WE8MSWIN1252

    Wohingegen am Testsystem GERMAN_GERMANY.UTF8 zurückkommt

    Werde mal am Entwicklungssysetm UTF8 einsetzen und dann schauen, wie sich die Maske verhält ...