Mittwoch, Oktober 05, 2005

Länge von Long-Spalten anzeigen

Vom Datentyp LONG rät Oracle ziemlich entschieden ab und empfiehlt stattdessen den Einsatz von LOBs. Für LONG-Spalten gibt es meines Wissens keine einfache Möglichkeit, die Länge zu bestimmen. Allerdings gibt es eine Funktion TO_LOB, mit der man LONGs in LOBs umwandeln kann, aber leider kann diese Funktion nur innerhalb einer Unterabfrage für ein INSERT verwendet werden:

create table test (a long);
insert into test values ('bllllllllllllllllllllllaaaaaaaaaaaaaaaaa');
select to_lob(a) 
  from test;

ERROR at line 1: ORA-00932: inconsistent datatypes: expected - got LONG

create table test2 (b clob);
insert into test2(b)
select to_lob(a) 
  from test;

select dbms_lob.getlength(b) from test2;

DBMS_LOB.GETLENGTH(B)
---------------------
40

Zur Bestimmung der Länge bräuchte man also eine Hilfstabelle, in die man den LONG-Wert einfügen könnte, um seine Länge dann mittels dbms_lob.getlength zu ermitteln - was natürlich eher umständlich ist.

Alternativ kann man die Länge auch in einem PL/SQL-Block bestimmen:

DECLARE
long_var LONG;
BEGIN
SELECT a 
  INTO long_var
  FROM test;

DBMS_OUTPUT.PUT_LINE('LOB_LENGTH:' || LENGTH(long_var));
end;
/
LOB_LENGTH:40

PL/SQL-Prozedur erfolgreich abgeschlossen.

Aber eine Funktion, die aus einem SQL-Statement heraus aufgerufen werden kann, wird daraus leider nicht, weil solche Funktionen keine LONGs als Parameter annehmen.   

Keine Kommentare:

Kommentar veröffentlichen