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:
Si la subconsulta resulta en una declaración de SELECT compatible con el RDBMS, el adaptador relacional inserta la subconsulta en el predicado WHERE del SQL generado.
Si la subconsulta no resulta en una declaración de SELECT válida para el RDBMS, el adaptador relacional recupera los valores de destino. A continuación, genera un predicado WHERE, con una lista de todas las combinaciones de valores de campos de origen y de destino.
Puede crear un archivo de SQL que contenga una subconsulta y el sinónimo correspondiente, mediante el comando HOLD FORMAT SQL_SCRIPT. Para más información, consulte Cómo crear informes con el lenguaje WebFOCUS .
Si el origen de datos sólo contiene los campos citados por DB_INFILE como campos de destino, el adaptador relacional crea una subconsulta que recupera los valores de destino. Si la subconsulta resulta en una declaración de SELECT compatible con el RDBMS, el adaptador relacional inserta la subconsulta en el predicado WHERE del SQL generado.
Si la subconsulta no resulta en una declaración de SELECT válida para el RDBMS, el adaptador relacional recupera una lista única de valores de destino. A continuación, genera un predicado WHERE, con una lista de todas las combinaciones de valores de campos de origen y de destino.
DB_INFILE(target_file, s1, t1, ... sn, tn)
donde:
Es el sinónimo del archivo de destino.
Son los campos del archivo de origen.
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).
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:
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:
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:
Permite que DB_INFILE cree la subconsulta si el análisis determina que es posible. Este es el valor predeterminado.
Evita que DB_INFILE cree una subconsulta. En su lugar, amplía la expresión con cláusulas IF y WHERE en la memoria.
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 |