Reverse engineering direct d'index basés sur une fonction

Dans Oracle 8i et versions ultérieures, vous pouvez créer des index basés sur des fonctions et des expressions qui impliquent une ou plusieurs colonnes dans la table en cours d'indexation. Un index basé sur une fonction précalcule la valeur de la fonction ou de l'expression et la stocke dans l'index. La fonction ou l'expression va remplacer la colonne d'index dans la définition de l'index.

Une colonne d'index avec une expression est stockée dans les tables système ayant un type de données LONG qui ne peut pas être concaténé dans une instruction de chaîne lors du reverse engineering.

Pour contourner cette limitation, SqlListQuery (catégorie Index dans le SGBD) contient un appel vers la requête définie par l'utilisateur SqlExpression utilisée pour récupérer l'expression d'index dans une colonne ayant le type de données LONG et pour concaténer cette valeur dans une instruction de chaîne (le code suivant est un sous-ensemble de SqlListQuery) :

select 
   '%SCHEMA%',
   i.table_name,
   i.index_name,
   decode(i.index_type, 'BITMAP', 'bitmap', ''),
   decode(substr(c.column_name, 1, 6), 'SYS_NC', '%SqlExpression.Xpr'||i.table_name||i.index_name||c.column_position||'%', c.column_name)||' '||c.descend||', ',
   c.column_position
from 
   user_indexes i,
   user_ind_columns c
where 
   c.table_name=i.table_name
   and c.index_name=i.index_name
[  and i.table_owner='%SCHEMA%']
[  and i.table_name='%TABLE%']
[  and i.index_name='%INDEX%']

L'exécution de SqlListQuery appelle l'exécution de la requête définie par l'utilisateur SqlExpression.

SqlExpression est suivi d'une variable définie par l'utilisateur comme suit :

{VAR, VAL}

select
   'Xpr'||table_name||index_name||column_position,
   column_expression
from
   all_ind_expressions
where 1=1
[  and table_owner='%SCHEMA%']
[  and table_name='%TABLE%']

Le nom de la variable définie par l'utilisateur est unique, il s'agit du résultat de la concaténation de "Xpr", du nom de table, du nom d'index et de la position de colonne.