DB_INFILE: Cómo probar valores en base a un archivo o una subconsulta de SQL

Cómo:

Referencia:

La función DB_INFILE compara uno o varios valores de campos de un archivo de origen con los valores de un archivo de destino. Puede basar esta comparación en uno o varios valores de campos. DB_INFILE devuelve el valor 1 (TRUE) si el conjunto de campos de origen coincide con el de los valores del archivo de destino. De lo contrario, la función devolverá un cero (cero, FALSE). Puede usar DB_INFILE en la misma ubicación en que una función sea válida, en solicitudes de WebFOCUS, como en una frase DEFINE o WHERE.

El archivo de destino puede ser cualquier origen de datos legible para WebFOCUS. En función de los orígenes de datos a los que acceda y los componentes de la solicitud, la comparación de valores será procesada por WebFOCUS o por un RDBMS.

Si la comparación es procesada por WebFOCUS, se lee el origen de datos de destino y se crea un archivo secuencial de forma dinámica, que incluye los valores de datos de origen junto con un sinónimo que describe el archivo de datos. Después, se construyen estructuras IF o WHERE en la memoria, con todas las combinaciones de valores de origen y de destino. Si los datos de destino contienen caracteres considerados como comodines en WebFOCUS, estos serán tratados como tal a menos que esté en vigor el comando SET EQTEST = EXACT.

Se dan las siguientes situaciones cuando el archivo de origen es un origen de datos relacional:


Principio de página

x
Sintaxis: Cómo Comparar los valores de campos de origen y de destino con DB_INFILE
DB_INFILE(target_file, s1, t1, ... sn, tn)

donde:

target_file

Es el sinónimo del archivo de destino.

s1, ..., sn

Son los campos del archivo de origen.

t1, ..., tn

Son los campos del archivo de destino.

La función devuelve el valor 1 si hay un conjunto de valores de destino que coincida con el conjunto de valores de origen. De lo contrario, la función devolverá un cero (0).


Principio de página

x
Referencia: Notas de uso de DB_INFILE


Ejemplo: Cómo comparar valores de origen y de destino utilizando un archivo de subconsulta de SQL

Este ejemplo usa el origen de datos WF_RETAIL DB2.

WF_RETAIL es un origen de datos de ejemplo que se crea pulsando con el botón derecho sobre una aplicación, en la Consola Web del Servidor de informes, y seleccionando Nuevo, Ejemplos en el menú de contexto.

El archivo de SQL llamado retail_subquery.sql contiene la siguiente subconsulta, que recupera los códigos de estado especificados en las regiones Central y NorthEast:

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

Éste es el archivo máster retail_subquery.mas:

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, $

Éste es el archivo de acceso retail_subquery.acx:

SEGNAME=RETAIL_SUBQUERY, CONNECTION=CON1, DATASET=RETAIL_SUBQUERY.SQL, $

Nota: Puede crear un archivo de subconsulta de SQL junto con el sinónimo correspondiente, mediante el comando HOLD FORMAT SQL_SCRIPT. Para más información, consulte el manual Cómo crear informes con el lenguaje WebFOCUS.

La siguiente solicitud emplea la función DB_INFILE para comparar los nombres de las regiones y los códigos de estado con los nombres recuperados por la subconsulta:

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

El seguimiento indica que la subconsulta fue insertada en el predicado WHERE del SQL generado:

 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 salida es:



Ejemplo: Cómo comparar valores de origen y de destino utilizando un archivo secuencial

El archivo secuencial empvalues.ftm contiene el nombre y el apellido de los empleados del departamento MIS:

SMITH           MARY        JONES           DIANE       MCCOY           JOHN        BLACKWOOD       ROSEMARIE   GREENSPAN       MARY        CROSS           BARBARA     

El archivo máster empvalues.mas describe los datos del archivo 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, $

Nota: Puede crear un archivo secuencial junto con el sinónimo correspondiente, mediante el comando HOLD FORMAT SQL_SCRIPT. Para más información, consulte el manual Cómo crear informes con el lenguaje WebFOCUS.

La siguiente solicitud, basada en el origen de datos FOCUS EMPLOYEE, emplea la función DB_INFILE para comparar los nombres de los empleados con los nombres almacenados en el archivo 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 salida es:


Principio de página

x
Sintaxis: Cómo Controlar la optimización de DB_INFILE

Para evitar la optimización de la expresión DB_INFILE, emita el siguiente comando:

SET DB_INFILE = {DEFAULT|EXPAND_ALWAYS|EXPAND_NEVER}

En una solicitud TABLE, emita el comando siguiente:

ON TABLE SET DB_INFILE  {DEFAULT|EXPAND_ALWAYS|EXPAND_NEVER}

donde:

DEFAULT

Permite que DB_INFILE cree la subconsulta si el análisis determina que es posible. Este es el valor predeterminado.

EXPAND_ALWAYS

Evita que DB_INFILE cree una subconsulta. En su lugar, amplía la expresión con cláusulas IF y WHERE en la memoria.

EXPAND_NEVER

Evita que DB_INFILE amplíe la expresión con cláusulas IF y WHERE en la memoria. En su lugar, intenta crear una subconsulta. Si eso no es posible, se genera un mensaje FOC32585 y el proceso se detiene.


WebFOCUS