La façon étrange avec laquelle la base de données Oracle gère le
NULL
dans les index peut être utilisée pour émuler les
index partiels. Pour cela, nous devons juste utiliser NULL
pour les lignes que nous ne devons pas indexer.
Pour le démontrer, nous émulons l'index partiel suivant :
CREATE INDEX messages_atraiter
ON messages (destinataire)
WHERE traite = 'N'
Tout d'abord, nous avons besoin d'une fonction qui renvoie la
valeur seulement si colonne TRAITE
vaut
'N'
.
CREATE OR REPLACE
FUNCTION pi_traites(traite CHAR, destinataire NUMBER)
RETURN NUMBER
DETERMINISTIC
AS BEGIN
IF traite IN ('N') THEN
RETURN destinataire;
ELSE
RETURN NULL;
END IF;
END;
/
La fonction doit être déterministe pour qu'elle soit utilisable dans une définition d'index.
Maintenant, nous pouvons traiter un index qui contient seulement
des lignes ayant TRAITE='N'
.
CREATE INDEX messages_atraiter
ON messages (pi_traites(traite, destinataire));
Pour utiliser l'index, vous devez utiliser l'expression indexée dans la requête :
SELECT message
FROM messages
WHERE pi_traites(traite, destinataire) = ?