Bonjour à toutes et tous,

Je vous soumets aujourd'hui un problème auquel je ne trouve pas de solution malgré de nombreuses tentatives et la lecture de beaucoup de posts sur le sujet, car je ne trouve pas d'exemple précis du cas auquel je suis confronté.

Dans un contexte d'analyse de l'environnement d'audit de Business Objects 4.2 (socle data est Oracle 11g), j'ai une sous-requête qui ne ramène aucun résultat à cause d'un problème de jointure sur une colonne de type CLOB (que je caste pourtant en VARCHAR2(100)) avec une colonne qui est nativement de type VARCHAR2(100).

Dans mon jeu de test, j'ai isolé une valeur précise qui, quand je la passe en "dur" (libellé de type texte) permet à ma sous-requête de ramener les valeurs attendues en rendant la jointure fonctionnelle.

Mais quand je la passe sous la forme d'une colonne de la table source (donc de type CLOB "castée" en VARCHAR2), la sous-requête ne ramène aucun résultat, et je soupçonne que le résultat du CAST ne correspond pas exactement à la valeur équivalente de type VARCHAR2 issue d'une autre table.

En alternative du CAST, j'ai aussi utilisé la fonction DBMS_LOB.SUBSTR, mais le résultat est le même, c'est à dire aucun résultat retourné, et j'imagine que le problème est identique, différence de contenu des colonnes de la jointure qui la rende non effective.

Voici ci-dessous la sous-requête concernée avec des commentaires pour clarifier mon propos :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
-- test sous-requête avec mise en évidence du problème lié au CAST (avec commentaires)
SELECT DISTINCT
  EYE_DOCUMENT.DOCUMENT_ID AS ID,
  CMS_DOCUMENT.CUID,
  A.EVENT_ID,
  MAX(A.START_TIME) AS DERNIERE_ACTUALISATION
FROM
  PBI4360_13135.EYE_DOCUMENT 
  INNER JOIN PBI4360_13135.EYE_SNAPSHOT ON (EYE_SNAPSHOT.SNAPSHOT_ID = EYE_DOCUMENT.DOCUMENT_SNAPSHOT_ID  AND  EYE_SNAPSHOT.SNAPSHOT_NAME = 'WEBI' AND EYE_SNAPSHOT.SNAPSHOT_RESULT = 1)
  INNER JOIN PBI4360_13135.CMS_DOCUMENT ON (EYE_DOCUMENT.DOCUMENT_ID = CMS_DOCUMENT.ID),
  PBI4AUDIT.ADS_EVENT A 
WHERE
  (
    CMS_DOCUMENT.CUID = 
       (
        SELECT DISTINCT 
           -- pour test : ce CUID explicite correspond à l'évènement d'audit dont l'ID est 17710233064828830405 -> ainsi la requête ramène la ligne attendue
           'M18kMqsAAKt6ACMDZgAAR0v.An71mMoAAAA'
           -- fin test
           -- avec cette fonction et pour ce même CUID (pour mémoire DBMS_LOB.SUBSTR produit toujours un VARCHAR2) -> ainsi la requête ne ramène rien :-(
           --DBMS_LOB.SUBSTR(C.EVENT_DETAIL_VALUE, 100, 1)
           -- en "castant" ce même CUID au format exact de CMS_DOCUMENT.CUID qui est nativement un VARCHAR2(100) -> ainsi aussi la requête ne ramène rien :-(
           --CAST(C.EVENT_DETAIL_VALUE AS VARCHAR2(100))  
        FROM
           PBI4AUDIT.ADS_EVENT B,
           PBI4AUDIT.ADS_EVENT_DETAIL C
        WHERE
           -- pour traiter l'évènement de la requête principale
           B.EVENT_ID = A.EVENT_ID
           -- pour aller chercher le détail de type 12 (CUID du document parent) dans la table détail des évènements
           AND C.EVENT_ID = B.EVENT_ID
           AND C.EVENT_DETAIL_TYPE_ID = 12
       )
   -- pour test : je force l'ID de l'évènement    
   AND A.EVENT_ID = 17710233064828830405
   -- fin test
   -- pour limiter le scope sur les 13 derniers mois glissants
   AND A.START_TIME >= ADD_MONTHS(SYSDATE, -13)
   -- seulement les actualisations, planifications et publications
   AND A.EVENT_TYPE_ID IN (1003,1011,1012)
   -- seulement ces types d'objets
   AND A.OBJECT_TYPE_ID IN ('AYfjfcAV7cNPh33akDfm2RE','AcfGhH5SbBNIsBrpeExxhDQ','AafS60mXMNlMv86vS0DuroU','AVx_3364fDBFni_bGCHtSyQ','AVSAUQfHHtpFsd9M2RM.qJ0') 
   -- l'objet de l'évènement d'audit doit être dans le répertoire générique de l'établissement    
   AND A.OBJECT_FOLDER_PATH LIKE '%/ETABLISSEMENTS/313 MP/%'
   -- pour utiliser les données du dernier snapshot Eyes360
   AND EYE_SNAPSHOT.SNAPSHOT_ID = (SELECT MAX(S.SNAPSHOT_ID) FROM PBI4360_13135.EYE_SNAPSHOT S WHERE S.SNAPSHOT_CMS = '@BI42PRD' AND S.SNAPSHOT_NAME = 'WEBI' AND S.SNAPSHOT_RESULT = 1 GROUP BY S.SNAPSHOT_CMS)
   -- par sécurité, je ne sélectionne aussi que les documents se trouvant dans le répertoire générique de l'établissement  
   AND EYE_DOCUMENT.DOCUMENT_PATH  LIKE  '%/ETABLISSEMENTS/313 MP/%'
  )
GROUP BY 
   EYE_DOCUMENT.DOCUMENT_ID,
   CMS_DOCUMENT.CUID,
   A.EVENT_ID
ORDER BY 4 DESC
Avez-vous une idée de ce qu'il se passe sur cette jointure et si oui, comment contourner ce problème ?

N'hésitez pas si vous avez des questions par rapport à cet exemple car ce n'est pas forcément évident de se plonger à brûle pourpoint dans le contexte d'une telle sous-requête qui fait partie d'une (très) grosse requête principale.

Je vous remercie beaucoup par avance pour votre avis et votre aide, tous vos conseils seront les bienvenus.

Bel après-midi à vous toutes et tous,

Yves