it-swarm.com.de

Abfragen einer CLOB-Spalte in Oracle

Ich versuche, eine Abfrage auszuführen, die einige Spalten enthält, die ein CLOB-Datentyp sind. Wenn ich die Abfrage wie normal ausführe, haben alle diese Felder nur (CLOB) als Wert.

Ich habe es mit DBMS_LOB.substr(column) versucht und erhalte den Fehler 

ORA-06502: PL/SQL: numeric or value error: character string buffer too small

Wie kann ich die CLOB-Spalte abfragen?

37
Catfish

Wenn Sie die Teilzeichenfolge einer CLOB-Spalte abrufen und ein Abfragetool verwenden, für das Einschränkungen hinsichtlich der Größe/des Puffers gelten, müssen Sie den BUFFER-Wert manchmal auf eine größere Größe setzen. Verwenden Sie beispielsweise SET BUFFER 10000, wenn Sie SQL Plus verwenden, um es auf 10000 festzulegen, da der Standardwert 4000 ist.

Wenn Sie den Befehl DBMS_LOB.substr ausführen, können Sie auch die Anzahl der Zeichen angeben, die Sie zurückgeben möchten, und den Versatz, von dem aus die Zeichen zurückgegeben werden sollen. Wenn Sie DBMS_LOB.substr(column, 3000) verwenden, wird der Puffer möglicherweise auf einen ausreichend kleinen Betrag begrenzt.

Weitere Informationen zum Befehl substr finden Sie in der Dokumentation zu Oracle

 DBMS_LOB.SUBSTR (
 Lob_loc IN CLOB CHARACTER SET ANY_CS, 
 Betrag IN INTEGER: = 32767, 
 Offset IN INTEGER: = 1) 
 RETURN VARCHAR2 CHARACTER SET lob_loc% CHARSET; 

38
mrjohn

Das funktioniert

select DBMS_LOB.substr(myColumn, 3000) from myTable
62
Chris

Ich bin mit HugeClob in meiner Oracle-Datenbank in eine andere Situation geraten. Der dbms_lob.substr erlaubte nur einen Wert von 4000 in der Funktion, zB:

dbms_lob.substr(column,4000,1)

für meinen HughClob, der größer war, musste ich zwei Aufrufe in select verwenden:

select dbms_lob.substr(column,4000,1) part1, 
       dbms_lob.substr(column,4000,4001) part2 from .....

Ich habe von einer Java-App angerufen, also habe ich einfach part1 und part2 verkettet und als E-Mail gesendet.

7
Cliff Bender

Für große CLOB-Selects können auch verwendet werden:

SELECT dbms_lob.substr( column_name, dbms_lob.getlength(column_name), 1) FROM foo

1
Kapitula Alexey

Wenn es ein CLOB ist, warum können wir die Spalte nicht laden und dann normal suchen?

Erstellen Sie eine Tabelle

CREATE TABLE MY_TABLE(Id integer PRIMARY KEY, Name varchar2(20), message clob);

Erstellen Sie einige Datensätze in dieser Tabelle

INSERT INTO MY_TABLE VALUES(1,'Tom','Hi This is Row one');
INSERT INTO MY_TABLE VALUES(2,'Lucy', 'Hi This is Row two');
INSERT INTO MY_TABLE VALUES(3,'Frank', 'Hi This is Row three');
INSERT INTO MY_TABLE VALUES(4,'Jane', 'Hi This is Row four');
INSERT INTO MY_TABLE VALUES(5,'Robert', 'Hi This is Row five');
COMMIT;

Suchen Sie in der Clob-Spalte

SELECT * FROM MY_TABLE where to_char(message) like '%e%';

Ergebnisse

ID   NAME    MESSAGE   
===============================  
1    Tom     Hi This is Row one         
3    Frank   Hi This is Row three
5    Robert  Hi This is Row five
0
Raj

Eine weitere Option ist, eine Funktion zu erstellen und diese Funktion jedes Mal aufzurufen, wenn Sie die Clob-Spalte auswählen müssen. 

create or replace function clob_to_char_func
(clob_column in CLOB,
 for_how_many_bytes in NUMBER,
 from_which_byte in NUMBER)
return VARCHAR2
is
begin
Return substrb(dbms_lob.substr(clob_column
                            ,for_how_many_bytes
                            ,from_which_byte)
            ,1
            ,for_how_many_bytes);
end;

und nennen Sie diese Funktion als;

SELECT tocharvalue, clob_to_char_func(tocharvalue, 1, 9999)
FROM (SELECT clob_column AS tocharvalue FROM table_name);
0
Mustafa