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.