Ik probeer een query uit te voeren met een paar kolommen die een CLOB-gegevenstype zijn. Als ik de query zoals normaal uitvoer, hebben al die velden gewoon (CLOB)
als waarde.
Ik heb geprobeerd DBMS_LOB.substr(column
) te gebruiken en ik krijg de foutmelding
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
Hoe kan ik de CLOB-kolom opvragen?
Antwoord 1, autoriteit 100%
Dit werkt
select DBMS_LOB.substr(myColumn, 3000) from myTable
Antwoord 2, autoriteit 62%
Bij het ophalen van de substring van een CLOB-kolom en het gebruik van een query-tool die grootte-/bufferbeperkingen heeft, moet u soms de BUFFER op een grotere grootte instellen. Gebruik bijvoorbeeld tijdens het gebruik van SQL Plus de SET BUFFER 10000
om deze in te stellen op 10000, aangezien de standaardwaarde 4000 is.
Door de opdracht dbms_lob.substr
uit te voeren, kunt u ook het aantal tekens specificeren dat u wilt retourneren en de offset waarvan. Dus het gebruik van DBMS_LOB.substr(column, 3000)
kan het beperken tot een hoeveelheid die klein genoeg is voor de buffer.
Zie orakeldocumentatievoor meer informatie over het substr-commando
DBMS_LOB.SUBSTR ( lob_loc IN CLOB KARAKTER SET ANY_CS, bedrag IN INTEGER := 32767, offset IN INTEGER := 1) RETURN VARCHAR2 KARAKTERSET lob_loc%CHARSET;
Antwoord 3, autoriteit 11%
Ik kwam een andere aandoening tegen met HugeClob in mijn Oracle-database. De dbms_lob.substr
stond alleen een waarde van 4000 toe in de functie, bijvoorbeeld:
dbms_lob.substr(column,4000,1)
dus voor mijn HughClob die groter was, moest ik twee aanroepen gebruiken in select
:
select dbms_lob.substr(column,4000,1) part1,
dbms_lob.substr(column,4000,4001) part2 from .....
Ik belde vanuit een Java-app, dus ik heb gewoon deel1 en deel2 samengevoegd en als e-mail verzonden.
Antwoord 4, autoriteit 8%
Als het een CLOB is, waarom kunnen we de kolom dan niet_charen en dan normaal zoeken?
Maak een tafel
CREATE TABLE MY_TABLE(Id integer PRIMARY KEY, Name varchar2(20), message clob);
Maak enkele records in deze tabel
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;
Zoeken in de clob-kolom
SELECT * FROM MY_TABLE where to_char(message) like '%e%';
Resultaten
ID NAME MESSAGE
===============================
1 Tom Hi This is Row one
3 Frank Hi This is Row three
5 Robert Hi This is Row five
Antwoord 5
Voor grote CLOB-selecties kan ook worden gebruikt:
SELECT dbms_lob.substr( column_name, dbms_lob.getlength(column_name), 1) FROM foo