Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   RAW Feld richtig auslesen (https://www.delphipraxis.net/192210-raw-feld-richtig-auslesen.html)

Jumpy 29. Mär 2017 14:14

Datenbank: Oracle • Version: 11g • Zugriff über: ADO

RAW Feld richtig auslesen
 
Hallo,

ich habe in einer Oracle-DB ein Feld vom Datentyp RAW. Wenn ich mir das mit Substr mal als Text ausgeben lasse, steht darin (Dummy-Besipiel):

003100320033

Ich weiß, dass das dem String 123 entsprechen soll.

Versuche ich dies im SQL als String auszulesen mittels UTL_RAW.CAST_TO_Varchar2(Feld) kommt nichts anzeigbares raus.

Wenn ich mal selber '123' mit UTL_RAW.CAST_TO_RAW('123') in das Feld schreibe steht darin:

313233

Es fehlen also immer die Nullen.

Irgendwie schein mir das ein Charset/Multibyte/irgendwas-Problem zu sein und ich weiß nicht, wie ich jetzt (SQL) aus dem Raw-Feld mit 003100320033 den Inhalt 123 rauskriege. Was muss ich das wie konvertieren vorher?

jaenicke 30. Mär 2017 08:04

AW: RAW Feld richtig auslesen
 
Zitat:

Zitat von Jumpy (Beitrag 1365879)
003100320033

Ich weiß, dass das dem String 123 entsprechen soll.

Tut es auch. $31 ist der hexadezimale Code für 1, siehe Ascii-Tabelle. Und ein Unicodezeichen ist zwei Byte groß, also $0031.

Mit Raw-Feldern habe ich noch nicht gearbeitet und weiß daher nicht wie man die Auslesen kann. Ich hätte es mit FieldByName(...).AsWideString versucht, aber da Delphi 6 damals noch nicht unicodefähig war...
Ansonsten, wenn du es im Speicher jetzt als AnsiString hast mit 0, 0, 3, 1 usw. jeweils als ein Zeichen, könntest du jeweils 4 Zeichen kopieren und mit
Delphi-Quellcode:
Chr(StrToInt('$' + Copy(DeinString, 1, 4)))
versuchen auszulesen.

Vermutlich gibt es aber auch noch bessere Lösungen.

Jumpy 30. Mär 2017 09:14

AW: RAW Feld richtig auslesen
 
Zur Klarstellung: Ich möchte das wenn möglich auf SQL-Ebene lösen, nicht in einer Delphianwendung. Hintergrund ist vereinfacht, dass 123 sowas wie ein Fremdschlüssel ist, der auf einen Datensatz in einer anderen Tabelle verweist (ohne das es jetzt tatsächlich ein Fremdschlüssel im Datenbank Sinne als Constraint ist). Die Fremd-Originalanwendung wird das vermutlich wie von jaenicke gedacht irgendwie in der Anwendung lösen, ich würde für eine externe Auswertung da gerne einen Join der zwei Tabellen hinbekommen.

HolgerX 30. Mär 2017 12:42

AW: RAW Feld richtig auslesen
 
Hmm..

Schom mal mit 'Select cast(<RawdataField> AS NVARCHAR2) from TABLE' versucht?

Jumpy 30. Mär 2017 14:14

AW: RAW Feld richtig auslesen
 
Zitat:

Zitat von HolgerX (Beitrag 1365972)
Schom mal mit 'Select cast(<RawdataField> AS NVARCHAR2) from TABLE' versucht?

Liefert leider auch nur 003000310032 als "String".

jaenicke 30. Mär 2017 14:58

AW: RAW Feld richtig auslesen
 
Vielleicht ist UTL_RAW ja das Problem. Vielleicht geht es mit UTL_I18N.RAW_TO_CHAR (DeinFeld, 'AL32UTF8')?

Jumpy 31. Mär 2017 08:52

AW: RAW Feld richtig auslesen
 
UTL_I18N. kannte ich nicht und das hat mir zunächst Hoffnung gemacht. Half aber leider auch nicht.
Wenn ich nichts sinnvolles mehr finde werde ich es versuchen mit:

Substr(Feld,4,1)||Substr(Feld,8,1)||Substr(Feld,12 ,1)

Da es nur um einen Teil des Feldes geht der dem PK einer anderen Tabelle entspricht und dieser Teil nur numerisch ist kann ich so aus z.B. 0032->2 gewinnen usw.
Wenn ich dann doch irgendwo bei Oracle noch eine andere Lösung finde, oder jemand von euch noch eine Idee hat, kann ich das ja anpassen.

Danke für den Einsatz

Elvis 1. Apr 2017 16:26

AW: RAW Feld richtig auslesen
 
Raw ist ziemlich alt, das UTL_RAW package sollte es schon in yestercentury Oracle versionen geben. (in denen habe ich es vor Ewigkeiten zuletzt benutzt, k.A. wie es mit 11g/12c aussieht)
Was du wohl suchst ist utl_raw.cast_to_varchar2 (bzw nvarchar2, je nach code page/encoding)
cast_to_raw funzt in die andere Richtung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz