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
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%';
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 |
Le temps moyen de INSTR est de 0,797.
Le temps moyen de COMME est de 0,823.
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