2010-09-24 20 views
33

Próbuję uruchomić kwerendę, która ma kilka kolumn, które są typem danych CLOB. Jeśli uruchomię zapytanie jak zwykle, wszystkie te pola mają po prostu wartość (CLOB).Jak wykonać zapytanie do kolumny CLOB w Oracle

Próbowałem za pomocą DBMS_LOB.substr(column) i pojawia się błąd

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

Jak mogę kwerendy kolumny CLOB?

+1

Używam TOAD. – Catfish

+0

Zazwyczaj narzędzia pulpitu, takie jak programista tok i PL/SQL, nie próbują podglądać kolumn CLOB, ale zamiast tego wyświetlają ogólny znacznik '' w klikalnym polu tekstowym, które pojawia się w osobnym oknie dużych danych po kliknięciu. –

Odpowiedz

35

Kiedy coraz podciąg kolumny CLOB i za pomocą narzędzia kwerendy, która ma ograniczenia/Rozmiar bufora czasami trzeba by ustawić BUFOR do większego rozmiaru. Na przykład podczas korzystania z SQL Plus użyj SET BUFFER 10000, aby ustawić go na 10000, domyślnie 4000.

Po uruchomieniu polecenia DBMS_LOB.substr możesz również określić liczbę znaków, które chcesz zwrócić, a także przesunięcie. Tak więc użycie DBMS_LOB.substr(column, 3000) może ograniczyć je do wystarczająco małej ilości bufora.

Zobacz oracle documentation uzyskać więcej informacji o poleceniu substr

 

    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

Ustawiłem ograniczenie do 3000 i zadziałało. Dzięki! – Catfish

0

Jeśli używasz SQL * Plus spróbować następujących ...

set long 8000 

select ... 
53

Działa

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

Inną opcją jest stworzenie funkcji i wywołanie tej funkcji za każdym razem trzeba wybrać kolumnę Clob.

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; 

i wywołaj tę funkcję jako;

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

Na wielkim CLOB wybiera również można stosować:

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

3

ja nie napotkasz innego stanu z HugeClob w mojej bazy danych Oracle. dbms_lob.substr dozwolone tylko wartość 4000 w funkcji, np:

dbms_lob.substr(column,4000,1) 

więc dla mojego HughClob który był większy, musiałem użyć dwóch połączeń w select:

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

byłem dzwoni z Aplikacja Java, więc połączyłem part1 i part2 i wysłałem jako e-mail.

+0

Jakie jest pytanie? – vulkanino

0

Aby dodać do odpowiedzi.

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

end; 
/

W dbms_lob.substr

first parameter jest clob który chcesz wyodrębnić.

Second parameter to długość klamry, którą chcesz wydobyć.

Third parameter jest z jakiego słowa chcesz wyodrębnić.

W powyższym przykładzie wiem, że mój rozmiar jest większy niż 50000, więc chcę mieć 4000 znaków.

Powiązane problemy