Comment : Référence : |
La fonction DB_INFILE compare une ou plusieurs valeurs dans un fichier source à des valeurs en un fichier cible. La comparaison peut être transmise à une ou plusieurs valeurs de champ. DB_INFILE renvoie la valeur 1 (TRUE) si le jeu de champs sources correspond au jeu de valeurs du fichier cible. Autrement, la fonction renvoie 0 (zéro, FALSE). DB_INFILE peut être utilisé où une fonction est valide dans une requête WebFOCUS, comme par exemple dans une phrase DEFINE ou WHERE.
Le fichier cible peut être toute source de données que WebFOCUS peut lire. En fonction des sources de données accédées et les composants dans la requête, soit WebFOCUS ou un RDBMS traitera la comparaison de valeurs.
Si WebFOCUS traite la comparaison, il lit la source de données cible et crée dynamiquement un fichier séquentiel contenant les valeurs de données cibles, avec un synonyme décrivant le fichier de données. Il génère ensuite les structures IF ou WHERE en mémoire avec toutes les combinaisons de valeurs sources et cibles. Si les données cibles contiennent des caractères que WebFOCUS considère comme caractères génériques, il les traitera comme caractères génériques à moins que la commande SET EQTEST = EXACT soit activée.
Les situations suivantes existent lorsqu'une source de données relationnelle est le fichier source :
Si la sous-requête résulte en une instruction SELECT prise en charge par le RDBMS, l'adaptateur relationnel insère la sous-requête dans le prédicat WHERE du SQL généré.
Si la sous-requête ne résulte pas en une instruction SELECT valide pour le RDBMS, l'adaptateur relationnel récupère les valeurs cibles. Elle génère ensuite un prédicat WHERE, avec une liste de toutes les combinaisons de valeurs de champ sources et cibles.
Vous pouvez créer un fichier SQL contenant une sous-requête et un synonyme correspondant à l'aide de la commande HOLD FORMAT SQL_SCRIPT. Pour plus d'informations, consultez le guide Création de rapports en langage WebFOCUS .
Si la source de données ne contient que ces champs référencés par DB_INFILE comme champs cibles, l'adaptateur relationnel crée une sous-requête qui récupère les valeurs cibles. Si la sous-requête résulte en une instruction SELECT prise en charge par le RDBMS, l'adaptateur relationnel insère la sous-requête dans le prédicat WHERE du SQL généré.
Si la sous-requête ne résulte pas en une instruction SELECT valide pour le RDBMS, l'adaptateur relationnel récupère une liste unique de valeurs cibles. Elle génère ensuite un prédicat WHERE avec une liste de toutes les combinaisons de valeurs de champ sources et cibles.
DB_INFILE(target_file, s1, t1, ... sn, tn)
où :
est le synonyme pour le fichier cible target_file
sont les champs de jointure dans le fichier source.
sont les champs du fichier cible.
La fonction renvoie la valeur 1 si un ensemble de valeurs cibles correspond au jeu de valeurs sources. Autrement, la fonction renvoie un zéro (0).
Cet exemple utilise la source de données WF_RETAIL DB2.
WF_RETAIL est un exemple de source de données que vous pouvez créer en effectuant un clic droit sur une application sur la console Web du serveur de rapports, en sélectionnant Nouveau, puis Exemples à partir du menu contextuel.
Le fichier SQL nommé retail_subquery.sql contient la sous-requête suivante qui récupère les codes de départements spécifiés dans les régions Centre et Nord-est :
SELECT MAX(T11.REGION), MAX(T11.STATECODE) FROM wrd_dim_geography T11 WHERE (T11.STATECODE IN('AR', 'IA', 'KS', 'KY', 'WY', 'CT', 'MA', 'NJ', 'NY', 'RI')) AND (T11.REGION IN('Central', 'NorthEast')) GROUP BY T11.REGION, T11.STATECODE
Le fichier maître retail_script.mas suit :
FILENAME=RETAIL_SUBQUERY, SUFFIX=DB2 , $ SEGMENT=RETAIL_SUBQUERY, SEGTYPE=S0, $ FIELDNAME=REGION, ALIAS=E01, USAGE=A15V, ACTUAL=A15V, MISSING=ON, $ FIELDNAME=STATECODE, ALIAS=E02, USAGE=A2, ACTUAL=A2, MISSING=ON, $
Le fichier d'accès retail_script.acx suit :
SEGNAME=RETAIL_SUBQUERY, CONNECTION=CON1, DATASET=RETAIL_SUBQUERY.SQL, $
Remarque : vous pouvez créer un fichier de sous-requête SQL, avec un synonyme correspondant, à l'aide de la commande HOLD FORMAT SQL_SCRIPT. Pour plus d'informations sur l'identification de composants de rapport, consultez le guide Création de rapports en langage WebFOCUS.
La requête suivante utilise la fonction DB_INFILE pour comparer les noms de région et les codes de département récupérés par la sous-requête :
TABLE FILE WF_RETAIL SUM REVENUE BY REGION BY STATECODE WHERE DB_INFILE(RETAIL_SUBQUERY, REGION, REGION, STATECODE, STATECODE) ON TABLE SET PAGE NOPAGE END
La trace montre que la sous-requête est insérée dans le prédicat WHERE dans le SQL généré :
SELECT
T11."REGION",
T11."STATECODE",
SUM(T1."Revenue")
FROM
wrd_fact_sales T1,
wrd_dim_customer T5,
wrd_dim_geography T11
WHERE
(T5."ID_CUSTOMER" = T1."ID_CUSTOMER") AND
(T11."ID_GEOGRAPHY" = T5."ID_GEOGRAPHY") AND
((T11."REGION", T11."STATECODE") IN (SELECT MAX(T11.REGION),
MAX(T11.STATECODE) FROM wrd_dim_geography T11 WHERE
(T11.STATECODE IN('AR', 'IA', 'KS', 'KY', 'WY', 'CT', 'MA',
'NJ', 'NY', 'RI')) AND (T11.REGION IN('Central', 'NorthEast'))
GROUP BY T11.REGION, T11.STATECODE))
GROUP BY
T11."REGION",
T11."STATECODE "
ORDER BY
T11."REGION",
T11."STATECODE "
FOR FETCH ONLY;
END
La sortie est :
Le fichier séquentiel empvalues.ftm contient le nom et prénom des employés dans le département MIS :
SMITH MARY JONES DIANE MCCOY JOHN BLACKWOOD ROSEMARIE GREENSPAN MARY CROSS BARBARA
Le fichier maître empvalues.mas décrit les données dans le fichier empvalues.ftm.
FILENAME=EMPVALUES, SUFFIX=FIX , IOTYPE=BINARY, $ SEGMENT=EMPVALUE, SEGTYPE=S0, $ FIELDNAME=LN, ALIAS=E01, USAGE=A15, ACTUAL=A16, $ FIELDNAME=FN, ALIAS=E02, USAGE=A10, ACTUAL=A12, $
Remarque : vous pouvez créer un fichier séquentiel, avec un synonyme correspondant, à l'aide de la commande HOLD FORMAT SQL_SCRIPT. Pour plus d'informations, consultez le guide Création de rapports en langage WebFOCUSmanuel.
La requête suivante contre la source de données FOCUS EMPLOYEE utilise la fonction DB_INFILE pour comparer les noms d'employés contre les noms stockés dans le fichier empvalues.ftm :
FILEDEF EMPVALUES DISK baseapp/empvalues.ftm TABLE FILE EMPLOYEE SUM CURR_SAL BY LAST_NAME BY FIRST_NAME WHERE DB_INFILE(EMPVALUES, LAST_NAME, LN, FIRST_NAME, FN) ON TABLE SET PAGE NOPAGE END
La sortie est :
Pour contrôler la prévention d'optimisation de l'expression DB_INFILE, lancez la commande suivante :
SET DB_INFILE = {DEFAULT|EXPAND_ALWAYS|EXPAND_NEVER}
Dans une requête TABLE, lancez la commande suivante:
ON TABLE SET DB_INFILE {DEFAULT|EXPAND_ALWAYS|EXPAND_NEVER}
où :
Active DB_INFILE pour créer une sous-requête si son analyse détermine que cela est possible. Il s'agit de la valeur par défaut.
Empèche DB_INFILE de créer une sous-requête. Plutôt, elle développe l'expression en une clause IF et WHERE dans la mémoire.
Empèche DB_INFILE de développer l'expression en une clause IF et WHERE dans la mémoire. Plutôt, elle tente de créer une sous-requête. Si cela n'est pas possible, un message FOC32585 est généré et le traitement s'arrête.
WebFOCUS |