Histórico da Página
Aviso |
---|
A partir do corte do pacote Logix 12.1.19, o validador de fontes Logix, a partir da ferramenta GCAD-Tools, irá bloquear fontes que estiverem utilizando esta função. Até lá, o validador apenas irá alertar sobre uso indevido de função obsoleta. Bloqueio ativado em 29/11/2017. |
Neste tópico você acessará informações sobre a inutilização da função log0800_prepare_sql() e orientações de como realizar a adequação dos códigos fontes no Logix para a nova padronização.
O motivo para retirada da função log0810_prepare_sql() do padrão de desenvolvimento do Logix é para atender a evolução das versões de banco de dados homologadas no produto.
A função log0810_prepare_sql() apenas foi criada para atender versões antigas do Logix, onde existiam diferenças de instrução SQL envolvendo a ação OUTER JOIN, que por padrão para o banco Informix, era utilizada diretiva "OUTER", precedendo as tabelas não obrigatórias no bloco da lista das tabelas (bloco FROM) de uma instrução SELECT realizada no banco de dados, mas o uso desta diretiva era uma particularidade apenas para o banco de dados Informix.
Para exemplificar como a condição OUTER JOIN era prevista em versões antigas dos bancos de dados homologados para o Logix, veja a diferença de uma mesma instrução SQL válida para os diferentes bancos de dados:
INFORMIX Diretiva OUTER | SELECT empresa.cod_empresa, log_empresa_compl.dat_encerram_ativ FROM empresa, OUTER log_empresa_compl WHERE log_empresa_compl.empresa = empresa.cod_empresa |
---|---|
ORACLE Diretiva (+) | SELECT empresa.cod_empresa, log_empresa_compl.dat_encerram_ativ FROM empresa, log_empresa_compl WHERE log_empresa_compl.empresa (+) = empresa.cod_empresa |
SQLSERVER Diretiva * | SELECT empresa.cod_empresa, log_empresa_compl.dat_encerram_ativ FROM empresa, log_empresa_compl WHERE log_empresa_compl.empresa = * empresa.cod_empresa |
Para resolver esta diferença, devido a não existir um recurso de conversão automática da condição OUTER do Informix para os padrões correspondentes dos bancos Oracle e SQLServer, os fontes do Logix foram ajustados para fazer uso da função log0810_prepare_sql() montando uma instrução SQL em um bloco de texto (CHAR) e este era enviado como parâmetro para tal função, que tinha como objetivo converter a instrução SQL conforme o banco de dados em uso no Logix e o resultado seria retornado com a instrução compatível com o banco de dados.
No exemplo de instrução SQL acima, usando o log0810_prepare_sql(), os fontes era codificados da seguinte forma, unindo numa única instrução SQL, o uso das 3 diretivas:
OUTER - Informix |
(+) - Oracle |
* - SQLServer |
Bloco de código | ||
---|---|---|
| ||
DEFINE sql_stmt CHAR(1000)
LET sql_stmt = "SELECT empresa.cod_empresa, log_empresa_compl.dat_encerram_ativ",
" FROM empresa, [OUTER] log_empresa_compl",
" WHERE log_empresa_compl.empresa [(+)] = [*] empresa.cod_empresa"
CALL log0810_prepare_sql(sql_stmt) RETURNING sql_stmt
WHENEVER ERROR CONTINUE
PREPARE var_query FROM sql_stmt
DECLARE cq_empresas CURSOR FOR var_query
WHENEVER ERROR STOP |
Com a evolução dos bancos de dados homologados para o Logix, esta diferença das diretivas utilizadas foram resolvidas e agora todos os bancos de dados fazem uso da instrução SQL no padrão ANSI SQL. Com isso, passamos a resolver o SQL anterior de uma única forma para todos os bancos de dados homologados para o Logix, utilizando o bloco LEFT OUTER JOIN:
INFORMIX ORACLE SQLSERVER | SELECT empresa.cod_empresa, log_empresa_compl.dat_encerram_ativ FROM empresa LEFT OUTER JOIN log_empresa_compl ON (log_empresa_compl.empresa = empresa.cod_empresa) |
---|
Poderão também ser utilizadas diretivas INNER OUTER JOIN, RIGHT OUTER JOIN ou FULL OUTER JOIN. A regra de uso será usar o padrão ANSI SQL, que seja válido para todos os bancos de dados homologados para o Logix.
Desta forma os códigos dos fontes Logix que fazem uso da função log0810_prepare_sql() precisam ser ajustados para adaptar os SQLs preparados e com chamada da função log0810_prepare_sql() para utilizarem o novo padrão ANSI SQL - OUTER JOIN e retirada da chamada da função log0810_prepare_sql() conforme exemplo abaixo:
Bloco de código | ||
---|---|---|
| ||
DEFINE sql_stmt CHAR(1000)
LET sql_stmt = "SELECT empresa.cod_empresa, log_empresa_compl.dat_encerram_ativ",
" FROM empresa LEFT OUTER JOIN log_empresa_compl",
" ON (log_empresa_compl.empresa = empresa.cod_empresa)"
WHENEVER ERROR CONTINUE
PREPARE var_query FROM sql_stmt
DECLARE cq_empresas CURSOR FOR var_query
WHENEVER ERROR STOP |
Neste caso poderia ser retirado o uso de SQL preparado da seguinte forma:
Bloco de código | ||
---|---|---|
| ||
WHENEVER ERROR CONTINUE
DECLARE cq_empresas CURSOR FOR
SELECT empresa.cod_empresa, log_empresa_compl.dat_encerram_ativ
FROM empresa LEFT OUTER JOIN log_empresa_compl
ON (log_empresa_compl.empresa = empresa.cod_empresa)
WHENEVER ERROR STOP |