Anmelden

View Full Version : INSERT mit CAST



Seiten : [1] 2

BDehmel
26-08-09, 14:03
Hallo zusammen,

ich möchte mit einem INSERT INTO eine Spalte mit einer anderen CCSID einfügen, als die Tabelle vorliegt:

INSERT INTO tabelle (Feld1) VALUES (CAST 'Polnischer Text' AS CHAR(60) CCSID 870));

Auf der einen iSeries funktioniert das, auf der anderen aber leider nicht. Dort gibt es dann den Fehler SQL0100. Nehme ich den CAST aus der Anweisung heraus, funktioniert das Einfügen. Auf beiden Maschinen läuft Version5R4.

Hat jemand einen Tipp woran das liegen könnte?

Gruß Björn

Fuerchau
26-08-09, 15:51
Ich weiß nicht was das soll.
Entscheidend ist die CCSID des Zielfeldes bzw. der Tabelle.
Beim Insert wird dann der Wert in die Ziel-CCSID konvertiert !
Ist die Ziel-CCSID z.B. 273 (Deutsch), wird der Text später beim Lesen auch als Deutsch interpretiert.

Woher kommt denn dein polnischer Text ?
Steht dein Job dann auch auf polnisch ?

Ausserdem ist eine Konvertierung von polnisch nach deutsch und zurück nicht sinnvoll (Datenverlust).

BDehmel
27-08-09, 07:15
Der Ursprungstext kommt ebenfalls von einer iSeries Datenbank. Die Tabelle liegt in CCSID 273 vor. Einige Texte wurden allerdings in einer polnischen Windows-Umgebung eingegeben. Damit wir die polnischen Umlaute in Osteuropäischem Windows (1250) korrekt darstellen können, wird während des SELECTs in die CCSID 870 gecastet.

Dieser Text wird über einen INSERT in einer anderen Tabelle (CCSID 273) gespeichert. Der Job, der den Insert durchführt hat ebenfalls eine 273 ID. Kann man die Zeichensatz ID eines SQL Jobs beeinflußen (ohne über den Green-Screen einzugreifen)?

Wird der Text ohne das Casting eingefügt, gehen die polnischen Umlaute verloren.

Aber bei meiner Frage geht es gar nicht um das Casting. Es geht viel mehr darum, dass Agregatfunktionen im INSERT nicht ausgeführt werden. Ich habe zum Beispiel auch RTRIM('BlaBla ') oder 'Hallo' CONCAT ' du da' ausprobiert. Inzwischen weiß ich auch, dass dieses Problem sich nicht nur auf die Tabelle bezieht, sondern ein Systemproblem sein muss. Ich habe auf beiden Maschinen jeweils eine neue Tabelle angelegt und meine Versuche mit gleichem Ergebnis durchgeführt. Die Warnung SQL0100 würde mich ja nicht stören, wenn der Datensatz wenigstens eingetragen werden würde.

Fuerchau
27-08-09, 07:35
SQL0100: Zeile für &1 nicht gefunden.

Dies kommt nur bei Verwendung eines "Select" bzw. "Insert ... Select" vor !

Die Ursache ist also nicht dein cast sondern was anderes.

PS:
SQL-Fehlertexte kannst du per
WRKMSGD () QSQLMSG
betrachten.
SQL-Fehler beginnen immer mit SQLxxxx wobei xxxx die 4-stellige vorzeichenlose Nr. ist.

BDehmel
27-08-09, 07:45
Das ist ja gerade das Verwirrende, dass der Fehler irgendwie nichts aussagend ist.

Und die Frage zielt auf das "andere" hin. Vielleicht hat ja jemand das Phänomen schon mal gehabt und beseitigen können.

Ich teste die SQL Anweisungen mit dem Client Access Tool "CWBUNDBS", dort wird der Fehler ebenfalls komplett ausgegeben.

Fuerchau
27-08-09, 08:12
Ich denke hier ist das Problem, dass SQL als ODBC-Zugriff ausgeführt wird.
Im Gegensatz zum Dialog/Batchjob hat ein SQL-ODBC-Job (QZDASOINIT) immer eine CCSID.

Normalerweise wird eine Codewandlung von einer CCSID in eine andere, die zu Datenverlust führt vom System abgewiesen.

Andererseits deutet auch einiges auf Repository-Fehler hin (QSYS2/SYSxxx).
Hierzu gabs auch schon mal Hinweise:

RCLSTG SELECT(*DBXREF)
ENDHOSTSVR SERVER(*DATABASE)
DLTSQLPKG SQLPKG(QGPL/QZDAPKG)
STRHOSTSVR SERVER(*DATABASE)

Die Ursache liegt meist daran, dass das SQLPKG aus vorherigen Releases stammt und nicht neu aufgebaut wurde.

BenderD
27-08-09, 10:29
@cast: das geht auch in einer View
@job CCSID: das lässt sich zuweilen toppen durch einen mehrfachen Cast mit Zwischencast nach 65535 (transparent data)
@SQL100: dein insert fliegt mir mit Token CAST not valid um die Ohren

D*B



Der Ursprungstext kommt ebenfalls von einer iSeries Datenbank. Die Tabelle liegt in CCSID 273 vor. Einige Texte wurden allerdings in einer polnischen Windows-Umgebung eingegeben. Damit wir die polnischen Umlaute in Osteuropäischem Windows (1250) korrekt darstellen können, wird während des SELECTs in die CCSID 870 gecastet.

Dieser Text wird über einen INSERT in einer anderen Tabelle (CCSID 273) gespeichert. Der Job, der den Insert durchführt hat ebenfalls eine 273 ID. Kann man die Zeichensatz ID eines SQL Jobs beeinflußen (ohne über den Green-Screen einzugreifen)?

Wird der Text ohne das Casting eingefügt, gehen die polnischen Umlaute verloren.

Aber bei meiner Frage geht es gar nicht um das Casting. Es geht viel mehr darum, dass Agregatfunktionen im INSERT nicht ausgeführt werden. Ich habe zum Beispiel auch RTRIM('BlaBla ') oder 'Hallo' CONCAT ' du da' ausprobiert. Inzwischen weiß ich auch, dass dieses Problem sich nicht nur auf die Tabelle bezieht, sondern ein Systemproblem sein muss. Ich habe auf beiden Maschinen jeweils eine neue Tabelle angelegt und meine Versuche mit gleichem Ergebnis durchgeführt. Die Warnung SQL0100 würde mich ja nicht stören, wenn der Datensatz wenigstens eingetragen werden würde.

Fuerchau
27-08-09, 13:10
Schau mal die Syntax:

cast(....)

Bei dir fehlt eine Klammer !

CAST('Polnischer Text' AS CHAR(60) CCSID 870)

BDehmel
27-08-09, 13:16
Okay, sorry das war mein Fehler. In meinen Tests war das Statement aber immer richtig gewesen. Hier habe ich nur ein Beispiel geschrieben. Dabei habe ich die öffnende Klammer vergessen.

BenderD
27-08-09, 13:34
... genau das geht aber und selbst bei kaputtester Datenbank kann das keinen sqlcode 100 liefern, der gehört zum SELECT. Es wäre schon sinnvoll das exakte Statement und die exakte Fehlermeldung zu posten...
D*B


Okay, sorry das war mein Fehler. In meinen Tests war das Statement aber immer richtig gewesen. Hier habe ich nur ein Beispiel geschrieben. Dabei habe ich die öffnende Klammer vergessen.