prog:orcle_datatype_long
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende Überarbeitung | |||
prog:orcle_datatype_long [2014/08/06 13:22] – gpipperr | prog:orcle_datatype_long [2016/10/24 12:53] (aktuell) – [Java JDBC und LONG Datentypen] gpipperr | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ===== Der Datentyp LONG und LONG RAW in der Oracle Datenbank ===== | ||
+ | |||
+ | Als grundlegende Regel gilt, dass die " | ||
+ | |||
+ | Mit RAW und LONG gibt es diverse Einschränkungen, | ||
+ | |||
+ | Statt Long oder RAW sollte die " | ||
+ | |||
+ | |||
+ | Allerdings sind im Data Dictionary der Datenbank selber auch in 11g R2 immer noch LONG Datentypen im Einsatz. | ||
+ | |||
+ | |||
+ | |||
+ | ==== Direkte Ausgabe der Wert in SQL*Plus ==== | ||
+ | |||
+ | In SQL Plus können die Werte einfach ausgelesen werden, dazu zuvor aber mit "set long 32767" den SQL*Plus Buffer konfigurieren. | ||
+ | |||
+ | Zum Beispiel um den den "Less Value" Wert auf einer Partition aus zu lesen: | ||
+ | <code sql> | ||
+ | |||
+ | ----------------------------- | ||
+ | -- Long values Vorbereitung | ||
+ | ----------------------------- | ||
+ | |||
+ | set long 32767 | ||
+ | |||
+ | |||
+ | select | ||
+ | , | ||
+ | , | ||
+ | , | ||
+ | from dba_tab_partitions p | ||
+ | , dba_segments s | ||
+ | where p.table_owner like upper('& | ||
+ | and p.table_name like upper('& | ||
+ | and p.table_name= s.SEGMENT_NAME (+) | ||
+ | and p.partition_name= s.PARTITION_NAME (+) | ||
+ | and p.table_owner = s.owner (+) | ||
+ | order by p.partition_position | ||
+ | / | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | ==== Formatieren einer Long Spalte mit UTL_RAW ==== | ||
+ | |||
+ | Leider steht keine interne Default Funktion wie to_char zur Verfügung einen Long Value direkt in char/ | ||
+ | |||
+ | Im [[ http:// | ||
+ | |||
+ | ==== Einfachste Version einer Hilfsfunktion zum Auslesen von EBDIC bzw einer DEC Daten in long Row Spalten in einer SAP Tabelle === | ||
+ | |||
+ | DEC = DEC MCS character | ||
+ | |||
+ | |||
+ | <code sql> | ||
+ | |||
+ | |||
+ | -- Wie werden die Zeichen in Hex dargestellt: | ||
+ | -- auf den Zeichensatz der SQL*Plus Session achten! | ||
+ | |||
+ | |||
+ | sql> | ||
+ | |||
+ | DUMP(CONVERT(' | ||
+ | ---------------------------------------------------------------------------------- | ||
+ | Typ=1 Len=18: 75, | ||
+ | |||
+ | |||
+ | --EBDIC Zeichensatz ' | ||
+ | |||
+ | sql> | ||
+ | |||
+ | DUMP(CONVERT(' | ||
+ | ----------------------------------------------------------------------------------------------------- | ||
+ | Typ=1 Len=24: 46, | ||
+ | |||
+ | |||
+ | -- das Ganze nun als RAW Wert | ||
+ | |||
+ | sql> | ||
+ | |||
+ | UTL_RAW.CAST_TO_RAW(CONVERT(' | ||
+ | ------------------------------------------------------------------------------------------------------------------- | ||
+ | 2E3FCBC8C13E4261C2C1CA3E2FC75FC1 | ||
+ | |||
+ | |||
+ | -- Hier am Beispiel einer Test Tabelle: | ||
+ | -- | ||
+ | |||
+ | create table rawtest (id number, wert long raw); | ||
+ | |||
+ | |||
+ | -- | ||
+ | -- 1 Test mit hex Angabe des Strings | ||
+ | insert into rawtest | ||
+ | values ( 1 | ||
+ | , hextoraw(' | ||
+ | / | ||
+ | |||
+ | -- 2 Test mit EBDIC Text und Convert | ||
+ | insert into rawtest | ||
+ | values ( 2 | ||
+ | , utl_raw.cast_to_raw(convert(' | ||
+ | ) | ||
+ | / | ||
+ | |||
+ | |||
+ | -- Funktion anlagen | ||
+ | -- Tabelle mit dem PK auslesen und den Wert in eine Variable schreiben | ||
+ | -- Wert dann je nach Bedarf konvertieren | ||
+ | -- | ||
+ | |||
+ | create or replace function readRawtoVarchar2(p_id number) | ||
+ | return varchar2 | ||
+ | as | ||
+ | v_raw long raw; | ||
+ | v_return varchar2(32000); | ||
+ | begin | ||
+ | select wert into v_raw | ||
+ | from rawtest where id=p_id; | ||
+ | |||
+ | v_return: | ||
+ | |||
+ | -- je nach dem wie der Zeichensatz der Umgebung steht entsprechend umwandeln | ||
+ | |||
+ | return convert(v_return,' | ||
+ | end; | ||
+ | / | ||
+ | |||
+ | -------------------------------------------------------------------------------------- | ||
+ | -- Konkrete Umsetzung für die Tabelle T003T | ||
+ | |||
+ | CREATE OR REPLACE FUNCTION readRawtoVarchar2T003T(p_key varchar2) | ||
+ | RETURN varchar2 | ||
+ | AS | ||
+ | v_raw long raw; | ||
+ | | ||
+ | BEGIN | ||
+ | | ||
+ | FROM atab | ||
+ | WHERE tabname = ' | ||
+ | and varkey = p_key; | ||
+ | | ||
+ | v_return: | ||
+ | |||
+ | -- je nachdem wie der Zeichensatz der Umgebung steht entsprechend umwandeln | ||
+ | | ||
+ | |||
+ | END; | ||
+ | / | ||
+ | |||
+ | -- | ||
+ | -- | ||
+ | --Auslesen | ||
+ | |||
+ | select readRawtoVarchar2(id) as wert from rawtest where id=1; | ||
+ | |||
+ | |||
+ | WERT | ||
+ | ----------------- | ||
+ | Kostenübernahme | ||
+ | -- | ||
+ | |||
+ | select readRawtoVarchar2(id) from rawtest where id=2; | ||
+ | |||
+ | |||
+ | WERT | ||
+ | ----------------- | ||
+ | Kostenübernahme | ||
+ | -- | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | === Test mit LONG RAW === | ||
+ | |||
+ | Hier ein Versuch mit Hilfe eines Ref Cursor das ganze flexible zu gestalten. | ||
+ | Leider kann ein generischer Ref Cursor mit einer Long Spalte aber in SQL*Plus nicht erzeugt werden .-( . | ||
+ | |||
+ | <code sql> | ||
+ | |||
+ | -- Test Table | ||
+ | create table t (id number, value long raw); | ||
+ | |||
+ | insert into t values (1, | ||
+ | commit; | ||
+ | |||
+ | -- Erster Versuch: | ||
+ | |||
+ | SQL> | ||
+ | |||
+ | select utl_raw.cast_to_varchar2(value) from t | ||
+ | * | ||
+ | ERROR at line 1: | ||
+ | ORA-00997: illegal use of LONG datatype | ||
+ | |||
+ | |||
+ | -- Hilfsfunktion definieren | ||
+ | |||
+ | create or replace function read(p_cursor sys_refcursor) return varchar2 is | ||
+ | v_long | ||
+ | v_return varchar2(32000); | ||
+ | v_id | ||
+ | begin | ||
+ | loop | ||
+ | fetch p_cursor | ||
+ | into v_id; | ||
+ | exit when p_cursor%notfound; | ||
+ | select value into v_long from t where id = v_id; | ||
+ | v_return := utl_raw.cast_to_varchar2(v_long); | ||
+ | --v_return: | ||
+ | end loop; | ||
+ | return v_return; | ||
+ | end; | ||
+ | |||
+ | |||
+ | |||
+ | -- Abfragen mit dem Erzeugen eines Cursor Objects in SQL*Plus | ||
+ | |||
+ | select read(cursor(select id from t)) from dual; | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | === Test mit LONG === | ||
+ | |||
+ | Der reine LONG Datentyp ist etwas einfacher zu handhaben, in PL/SQL ist ein implizierter Cast nach Varchar2 möglich. | ||
+ | |||
+ | |||
+ | <code sql> | ||
+ | |||
+ | --test Tabelle | ||
+ | create table t (id number, value long); | ||
+ | |||
+ | insert into t values (1, | ||
+ | commit; | ||
+ | |||
+ | |||
+ | |||
+ | -- Test Hilfsfunktion für PL/ | ||
+ | |||
+ | create or replace function read(p_cursor sys_refcursor) return varchar2 is | ||
+ | v_return varchar2(32000); | ||
+ | v_id | ||
+ | begin | ||
+ | loop | ||
+ | fetch p_cursor | ||
+ | into v_id; | ||
+ | exit when p_cursor%notfound; | ||
+ | | ||
+ | -- Bei Long ist kein explizter Cast notwendig! | ||
+ | | ||
+ | select value into v_return from t where id = v_id; | ||
+ | | ||
+ | end loop; | ||
+ | return v_return; | ||
+ | end; | ||
+ | / | ||
+ | |||
+ | |||
+ | -- Abfragen mit dem Erzeugen eines Cursor Objects in SQL*Plus | ||
+ | |||
+ | select read(cursor(select id from t)) from dual; | ||
+ | |||
+ | </ | ||
+ | |||
+ | === Tabelle mit einem Long Datentyp umkopieren === | ||
+ | |||
+ | Mit PL/SQL kann dann auch die Migration einer Tabelle mit Long Spalten in eine CLOB Spalte erfolgen. | ||
+ | |||
+ | <code sql> | ||
+ | |||
+ | --test Tabelle | ||
+ | create table t2 (id number, value clob); | ||
+ | |||
+ | set serveroutput on | ||
+ | |||
+ | declare | ||
+ | v_cursor sys_refcursor; | ||
+ | v_value | ||
+ | v_id | ||
+ | v_count | ||
+ | begin | ||
+ | open v_cursor for | ||
+ | select id | ||
+ | ,value | ||
+ | from t; | ||
+ | loop | ||
+ | fetch v_cursor | ||
+ | into v_id | ||
+ | ,v_value; | ||
+ | |||
+ | exit when v_cursor%notfound; | ||
+ | | ||
+ | insert into t2 | ||
+ | (id | ||
+ | ,value) | ||
+ | values | ||
+ | (v_id | ||
+ | ,v_value); | ||
+ | v_count := v_count + 1; | ||
+ | | ||
+ | -- commit every 1000 rows | ||
+ | if mod(v_count, | ||
+ | commit; | ||
+ | end if; | ||
+ | | ||
+ | end loop; | ||
+ | close v_cursor; | ||
+ | commit; | ||
+ | dbms_output.put_line(rpad(' | ||
+ | dbms_output.put_line(' | ||
+ | dbms_output.put_line(rpad(' | ||
+ | end; | ||
+ | / | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==== Java JDBC und LONG Datentypen ==== | ||
+ | |||
+ | Links: | ||
+ | |||
+ | * http:// | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | ==== Nach BLOB konvertieren ==== | ||
+ | |||
+ | |||
+ | Function **to_lob** verwenden: | ||
+ | * https:// | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | ==== Quellen ==== | ||
+ | |||
+ | * http:// | ||
+ | * http:// | ||
prog/orcle_datatype_long.txt · Zuletzt geändert: 2016/10/24 12:53 von gpipperr