web-dev-qa-db-fra.com

vérifier si clob contient la chaîne oracle

actuellement, j'ai une requête avec ce code to_char(CLOB_COLUM) like %s mais ce qui suit ne fonctionnera pas pour très gros clob Existe-t-il une autre solution pour vérifier si cette colonne contient une chaîne. Utilisation d'Oracle 11.2.0.4.0

7
Master Yi

Vous pouvez utiliser DBMS_LOB.INSTR( clob_value, pattern [, offset [, occurrence]] ) :

SELECT *
FROM   your_table
WHERE  DBMS_LOB.INSTR( clob_column, 'string to match' ) > 0;

ou

SELECT *
FROM   your_table
WHERE  clob_column LIKE '%string to match%';
11
MT0

Base sur la réponse de MT0. Je teste de quelle manière est efficace.

La longueur de CLOB Column est 155018 et recherchez la chaîne 32 length

Voici mon test.

| INSTR  | LIKE  |
|:-------|------:|
| 0.857  |0.539  |
| 0.127  |0.179  |
| 1.635  |0.534  |
| 0.511  |0.818  |
| 0.429  |1.038  |
| 1.586  |0.772  |
| 0.461  |0.172  |
| 0.126  |1.379  |
| 1.068  |1.088  |
| 1.637  |1.169  |
| 0.5    |0.443  |
| 0.674  |0.432  |
| 1.201  |0.135  |
| 0.419  |2.057  |
| 0.731  |0.462  |
| 0.787  |1.956  |

 enter image description here

Le temps moyen de INSTR est de 0,797.

Le temps moyen de COMME est de 0,823.

2
alan9uo

Si vous voulez voir la valeur de la colonne et que Oracle renvoie ORA-22835 (tampon trop petit) pour WHERE clob_column LIKE '%string to match%', appliquez une solution de contournement.

La combinaison de DBMS_LOB.instr et DBMS_LOB.substr pourrait être une solution. Voir par exemple cette astuce Stackoverflow . Donc, dans votre cas:

SELECT DBMS_LOB.substr(your_clob_column, DBMS_LOB.instr(your_clob_column,'string to match'), 1) AS Text
FROM your_table
WHERE DBMS_LOB.instr(your_clob_column, 'string to match') > 0 
0
Srdjan