2010-09-24 8 views
33

Ich versuche, eine Abfrage auszuführen, die einige Spalten hat, die ein CLOB-Datentyp sind. Wenn ich die Abfrage wie normal ausführe, haben alle diese Felder nur (CLOB) als Wert.Wie Sie eine CLOB-Spalte in Oracle abfragen

Ich versuchte DBMS_LOB.substr(column verwenden) und ich bekomme den Fehler

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

Wie ich die CLOB Spalte abfragen kann?

+1

Ich verwende TOAD. – Catfish

+0

In der Regel versuchen Desktop-Tools wie Toad und PL/SQL Developer nicht, CLOB-Spalten in der Vorschau anzuzeigen, sondern einen generischen '' Platzhalter in einem anklickbaren Textfeld anzuzeigen, das beim Klicken in ein separates Large Data-Fenster springt. –

Antwort

35

Wenn den Teil einer CLOB Spalte bekommen und ein Abfrage-Tool, das eine Größe/Puffer Einschränkungen hat manchmal müssen Sie die festlegen BUFFER zu einer größeren Größe. Zum Beispiel bei der Verwendung von SQL Plus verwenden, um die SET BUFFER 10000 es auf 10000 gesetzt als der Standard 4000.

Ausführen den DBMS_LOB.substr Befehls ist, dass Sie auch die Menge der Zeichen angeben, können Sie zurückkehren wollen und der von dem Offset. Die Verwendung von DBMS_LOB.substr(column, 3000) könnte es auf einen kleinen Betrag für den Puffer beschränken.

oracle documentation Siehe für weitere Informationen über die substr Befehl

 

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

+0

Ich habe es auf 3000 beschränkt und es hat funktioniert. Vielen Dank! – Catfish

0

Wenn Sie SQL * Plus-verwenden den folgend versuchen ...

set long 8000 

select ... 
53

Dies funktioniert

select DBMS_LOB.substr(myColumn, 3000) from myTable 
0

Eine weitere Option ist eine Funktion zu erstellen, und Sie diese Funktion jedes Mal aufrufen müssen clob Spalte auszuwählen.

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 diese Funktion als aufrufen;

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

Für große CLOB- wählt kann auch verwendet werden:

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

3

ich in einen anderen Zustand mit HugeClob in meiner Oracle-Datenbank ausgeführt habe. Die dbms_lob.substr nur einen Wert von 4000 in der Funktion, ex erlaubt:

dbms_lob.substr(column,4000,1) 

so für meinen HughClob, die größer war, hatte ich in select zwei Anrufe zu verwenden:

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

ich von einem anrief Java-App, so habe ich einfach Teil1 und Teil2 verkettet und als E-Mail gesendet.

+0

Was ist die Frage? – vulkanino

0

Um die Antwort hinzuzufügen.

declare 
v_result clob; 
begin 
---- some operation on v_result 
dbms_lob.substr(v_result, 4000 ,length(v_result) - 3999); 

end; 
/

In dbms_lob.substr

first parameter ist clob, die Sie extrahieren möchten.

Second parameter ist, wie viel Länge von clob Sie extrahieren möchten.

Third parameter ist aus welchem ​​Wort Sie extrahieren möchten.

Im obigen Beispiel weiß ich, dass meine Clob-Größe mehr als 50000 ist, also möchte ich letzte 4000 Zeichen.

Verwandte Themen