DB_INFILE : Tester des valeurs en fonction d'un fichier ou d'une sous-requête SQL

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 :


Haut de page

x
Syntaxe : Comparer les valeurs des champs Source et Cible avec DB_INFILE
DB_INFILE(target_file, s1, t1, ... sn, tn)

où :

target_file

est le synonyme pour le fichier cible target_file

s1, ..., sn

sont les champs de jointure dans le fichier source.

t1, ..., tn

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).


Haut de page

x
Référence : Notes d'utilisation pour DB_INFILE


Exemple : Comparer les valeurs sources et cibles avec un fichier de sous-requête SQL

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 :



Exemple : Comparer les valeurs sources et cibles avec un fichier séquentiel SQL

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 :


Haut de page

x
Syntaxe : Contrôler l'optimisation DB_INFILE

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ù :

Default

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.

EXPAND_ALWAYS

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.

EXPAND_NEVER

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