[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Dec 2016
    Beiträge
    18

    Umwandlung eines Schema von CCSID 273 in 1208 (UTF-8)

    Hallo zusammen,

    kann auf der i5 ein Schema von der CCSID 273 in die CCSID 1208 "transformiert" werden?
    Wir haben 2 Verfahren durchgeführt.


    Verfahren 1 ist auf einer Testmaschine anscheinend erfolgreich abgeschlossen worden.

    1. Restore des produktiven Schemas z als x_273
    2. Reduktion der x_273 auf Tabellen und Katalog-Views
    3. Anpassung der SQL-Katalogviews des Schemas x_273 per SQL
    4. Löschen der TAD310DA1 per SQL "drop TAD310DA1 cascade"
    5. Neuanlage des Zielschemas z und der Tabellen (mit dem bisherigen Namen) per SQL
    6. Kopieren aller Daten per
    CPYF FROMFILE(x_273/xxx_S00005) TOFILE(z/zzz_S00005) MBROPT(*REPLACE) FMTOPT(*MAP)
    7. Wiederanlage von Constraints etc.

    Verfahren 2 wurde produktiv verwendet und macht in einem JAVA-Programm Probleme (zum Beispiel bei decimal gezont 15stelligig ohne Nachkomma:
    Exception: java.lang.NumberFormatException
    Message: High-order nibble of the byte at array offset 293 is not valid. Byte value: 20

    ):

    1. Reduktion von Schema z auf Tabellen und Katalog-Views
    2. i5-Objektumbennnung (per RNMOBJ) von z auf x_273
    3. Anpassung der SQL-Katalogviews des Schemas x_273 per SQL
    4. Neuanlage des Zielschemas z und der Tabellen (mit dem bisherigen Namen) per SQL
    5. Kopieren aller Daten per
    CPYF FROMFILE(x_273/xxx_S00005) TOFILE(z/zzz_S00005) MBROPT(*REPLACE) FMTOPT(*MAP)
    6. Wiederanlage von Constraints etc.


    Hat jemand von euch hier Erfahrungswerte?
    Gibt es eine erprobte andere Vorgehensweise?


    Mit freundlichen Grüßen
    Axel Witaseck

  2. #2
    Registriert seit
    Jan 2001
    Beiträge
    850
    HI,

    ich bin jetzt nicht der 100% Profi,
    aber bei numerischen Werten spielt der Zeichensatz keine Rolle.

    Wir legen unsere SQL Tabellen in NVARCHAR an ( CCSID 1200 ) und nicht in UTF-8

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Die einfachere Variante ist eher pur SQL.
    Wenn die Struktur (Spaltennamen, Anzahl und Reihenfolge) der Tabellen ja identisch ist, kann nach dem Create ein simpler "insert into newschema.tablename select * from oldschema.tablename" angewendet werden. Das kann genauso gut auch per RUNSQL in CLP/CLLE erfolgen.

    Zoned-Variablen müssen Zoned bleiben oder können auch in decimal konvertiert werden, da sie in SQL sonst nicht als Zahl verwendet werden können.
    In Java lassen sich Zahlen i.W. nur als BigDecimal oder eben double/float verarbeiten.

    Und ja, für RPGLE und SQL ist NVARCHAR praktischer (CCSID 1200 ist da der Default), da sie in ILERPG in UCS2 zur Verfügung stehen und bei der Remoteverarbeitung (SQL/ODBC/JDBC) der Typ String damit dargestellt wird und somit keine Umwandlung UTF8<=>1200 bei der Verarbeitung erfolgen muss.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Ich würde das nochmals anders machen!
    1. Über Reverse Engineering die SQL Erstellungsstatements (wichtig CREATE OR REPLACE TABLE!) generieren.
    2. In den SQL Scripts Die CCSIDs in den Spalten umsetzen, also von 273 auf 1208
    3. Die CREATE OR REPLACE Statements ausführen (die Umsetzung erfolgt automatisch).
    Kopieren oder an den Catalog-Daten herumfummeln ist nicht nötig (und so wie so kritisch zu betrachten).
    Ebenso müssen auch keine abhängigen Objekte erstellt werden.

    Anmerkung: Falls Ihr mit RPG arbeitet könnten die UTF-8 Spalten größere Probleme bereiten. RPG konvertiert per Default die Daten den Tabellen in die Job-CCSID. Das ist vielleicht heute noch kein Problem, aber vielleicht in Zukunft. Nicht konvertierbare Zeichen werden durch Substitutions-Zeichen ersetzt. Ebenso arbeiten alle RPG String per Default auf Byte-Ebene. Wenn jetzt ein Zeichen mehr als ein Byte benötigt gibt es Probleme.
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  5. #5
    Registriert seit
    Dec 2016
    Beiträge
    18
    Hallo Frau Hauser,

    vielen Dank für die Rückmeldung.
    Alles läuft ohne RPG, es ist eine JAVA-Anwendung
    ("Dialog läuft auf Tomcat-Server").

    Das alte Schema mit den modifizierten SQL-Katalogviews wird nur für den CPYF
    (arbeitet ja mit den Systemnamen der Tabellen) benötigt und wird dann gelöscht.

    Wie kommen dann die Daten vom alten ins neue Schema?

  6. #6
    Registriert seit
    Dec 2016
    Beiträge
    18
    Hallo Herr Fuerchau,

    das mit dem SQL wäre eine gute alternative zum CPYF.

  7. #7
    Registriert seit
    Dec 2016
    Beiträge
    18
    Das sollte so sein, aber bei der 2. Methode kommen Fehler auf echte Zahlenspalten.

  8. #8
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    ... dummerweise hat die Eier Variante von DB2 kein Alter Schema für den rename und der save restore funktioniert wohl nicht so, wie er sollte, sonst wäre das Repository der _xyz Variante korrekt. Da würde ich als erstes mal einen software defect melden.

    Grundsätzlich gilt erst einmal: man habe ein Erstellungsskript für die Datenbank!

    - Anpassung des Skripts auf die gewünschte CCSID
    - Abfahren des Skripts.
    - Erstellung eines insert select skripts für alle Tables (kann man generieren)
    - abfahren des Skripts

    et voila!

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  9. #9
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    Zitat Zitat von Witaseck Beitrag anzeigen
    Das sollte so sein, aber bei der 2. Methode kommen Fehler auf echte Zahlenspalten.
    ... das würde ich mal eher für einen Fehler des JDBC Treibers halten. Trotz desto nichts muss das Gefummel des Repositoties und der CPYF da raus.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  10. #10
    Registriert seit
    Dec 2016
    Beiträge
    18
    Das liest sich gut.

    Dann kann die CL-Schleife anstatt CPYF einen SQL als "insert into newschema.tablename select * from oldschema.tablename" mit den SQL-Namen der Tabellen ausführen.

  11. #11
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    Zitat Zitat von Witaseck Beitrag anzeigen
    Das liest sich gut.

    Dann kann die CL-Schleife anstatt CPYF einen SQL als "insert into newschema.tablename select * from oldschema.tablename" mit den SQL-Namen der Tabellen ausführen.
    ... ich würde da ein reines SQL skript vorziehen. Du musst Dir natürlich noch ein paar Gedanken mit Deinen constraints machen. Bei referential constraints Reihenfolge der Füll Operationen.
    Für eine SQL Datenbank sollte man dazu in der Lage sein, diese mit SQL komplett neu aufzubauen, das sollte mit geringen Anpassungen auf jeder beliebigen SQL Datenbank laufen.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  12. #12
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Wenn Ihr das ganze so macht wie ich es beschrieben habe, braucht Ihr Euch weder um irgendwelche Kopierereien, noch um irgendwelche abhängigen Objekte zu kümmern!

    1. SQL Skripte für die Tabellen generieren (wichtig CREATE OR REPLACE)
    2. CCSID austauschen
    3. Laufen lassen
    4. FERTIG!!!
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

Similar Threads

  1. CCSID 273 und CCSID 500
    By jaimosky in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 26-08-20, 10:55
  2. CCSID Umstellung von 65535 auf 273 gefährlich?
    By becama in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 03-09-15, 13:46
  3. ccsid 273 /1153 nach 1208 (Unicode)
    By K_Tippi in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 01-09-15, 10:48
  4. Zeichenumsetzung zwischen CCSID 273 und CCSID 8612 ungültig
    By schatte in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 08-02-11, 17:36
  5. Unicode: UCS-2 (13488) oder UTF-8 (1208)
    By edv90020 in forum NEWSboard Programmierung
    Antworten: 9
    Letzter Beitrag: 13-03-08, 12:52

Tags for this Thread

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •