Como: Referência: |
A função DB_INFILE compara um ou mais valores de campo em um arquivo fonte com valores em um arquivo alvo. A comparação pode ser baseada em um ou mais valores de campo. DB_INFILE exibe o valor 1 (TRUE) caso o conjunto de campos fonte corresponda a um conjunto de valores do arquivo alvo. Caso contrário, a função retorna 0 (zero, FALSE). DB_INFILE pode ser utilizado onde uma função é valida em uma solicitação WebFOCUS, como em um DEFINE ou uma frase WHERE.
O arquivo alvo pode ser qualquer fonte de dados que o WebFOCUS pode ler. Dependendo das fontes de dados acessadas e dos componentes na solicitação, o WebFOCUS ou o RDBMS irá processar a comparação de valores.
Se o WebFOCUS processar a comparação, ele irá ler a fonte de dados alvo e criar, de forma dinâmica, um arquivo sequencial que contém os valores de dados alvo juntamente com um sinônimo descrevendo o arquivo de dados. Em seguida, a ferramenta construirá estruturas IF ou WHERE na memória com todas as combinações de valores fonte e alvo. Se os dados alvo contiverem caracteres que o WebFOCUS considera curinga, o programa irá tratá-los como caracteres curingas a não ser que o comando SET EQTEST = EXACT esteja em vigor.
As situações a seguir existem quando uma fonte de dados relacionais for o arquivo fonte:
Caso a subconsulta resulte em uma declaração SELECT suportada pelo RDBMS, o adaptador relacional insere a subconsulta no WHERE do SQL gerado.
Se a subconsulta não resultar em uma declaração SELECT válida para o RDBMS, o adaptador relacional irá obter os valores alvo. Em seguida, o adaptador irá gerar um WHERE, com uma lista de todas as combinações de valores de campo fonte e alvo.
Você pode criar um arquivo SQL que contém uma subconsulta e um sinônimo correspondente utilizando o comando HOLD FORMAT SQL_SCRIPT. Para obter mais informações, consulte o manual Como criar relatórios com a Linguagem WebFOCUS .
Se a fonte de dados contiver apenas os campos referenciados pela função DB_INFILE como campos alvo, o adaptador relacional cria uma subconsulta que obtém os valores alvo. Caso a subconsulta resulte em uma declaração SELECT suportada pelo RDBMS, o adaptador relacional insere a subconsulta no WHERE do SQL gerado.
Se a subconsulta não resultar em uma declaração SELECT válida para o RDBMS, o adaptador relacional irá obter uma lista única dos valores alvo. Em seguida, o adaptador irá gerar um WHERE, com uma lista de todas as combinações de valores de campo fonte e alvo.
DB_INFILE(target_file, s1, t1, ... sn, tn)
onde:
É o sinônimo do arquivo alvo.
São os campo do arquivo fonte.
São os campo do arquivo alvo.
A função exibe o valor 1 caso um conjunto de valores alvo correspondam ao conjunto de valores fonte. Caso contrário, a função exibirá um zero (0).
Este exemplo utiliza a fonte de dados WF_RETAIL DB2.
WF_RETAIL é uma fonte de dados de exemplo que você pode criar clicando com o botão direito em um aplicativo no Console da Web do Servidor de Relatórios selecionando Novo e, em seguida, Exemplos no menu de contexto.
O arquivo SQL com nome retail_subquery.sql contém a seguinte subconsulta que obtém códigos de estado especificados nas regiões Central e Nordeste:
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
O Arquivo Master retail_subquery.mas se encontra a seguir:
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, $
O Arquivo de Acesso retail_subquery.acx se encontra a seguir:
SEGNAME=RETAIL_SUBQUERY, CONNECTION=CON1, DATASET=RETAIL_SUBQUERY.SQL, $
Observação: Você pode criar um arquivo de subconsulta SQL juntamente com um sinônimo correspondente utilizando o comando HOLD FORMAT SQL_SCRIPT. Para obter mais informações, consulte o manual Como Criar Relatórios com a Linguagem do WebFOCUS.
A seguinte solicitação utiliza a função DB_INFILE para comparar os nomes de regiões e códigos de estado com os nomes obtidos pela 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
O rastro mostra que a subconsulta foi inserida no predicado WHERE no SQL gerado:
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
A saída é:
O arquivo sequencial empvalues.ftm contém o último e primeiro nomes dos funcionários no departamento MIS:
SMITH MARY JONES DIANE MCCOY JOHN BLACKWOOD ROSEMARIE GREENSPAN MARY CROSS BARBARA
O Arquivo Master empvalues.mas descreve os dados contidos no arquivo 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, $
Observação: Você pode criar um arquivo de sequencial juntamente com um sinônimo correspondente utilizando o comando HOLD FORMAT SQL_SCRIPT. Para obter mais informações, consulte o manual Como criar relatórios com a Linguagem WebFOCUS manual.
A solicitação a seguir,em relação à fonte de dados FOCUS EMPLOYEE, utiliza a função DB_INFILE para comparar os nomes de funcionários com os nomes armazenados no arquivo 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
A saída é:
Para controlar a otimização da expressão DB_INFILE, emita o comando a seguir:
SET DB_INFILE = {DEFAULT|EXPAND_ALWAYS|EXPAND_NEVER}
Em uma solicitação TABLE, emita o comando a seguir:
ON TABLE SET DB_INFILE {DEFAULT|EXPAND_ALWAYS|EXPAND_NEVER}
onde:
Permite que DB_INFILE crie uma subconsulta caso sua análise determine que seja possível. Este é o valor padrão.
Impede que DB_INFILE crie uma subconsulta. Em vez disso, expande a expressão em cláusulas IF e WHERE na memória.
Impede que DB_INFILE expanda a expressão em cláusulas IF e WHERE na memória. Em vez disso, tenta criar uma subconsulta. Caso não seja possível, uma mensagem FOC32585 é gerada e o processo é interrompido.
Information Builders |