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 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 Logix.
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 de OUTER JOIN, que por padrão para o banco Informix, no passado, 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 do banco informix o uso desta diretiva.
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 dadosEm versões mais antigas destes bancos de dados, era utilizada a condição OUTER JOIN da seguinte forma:
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, era feito o , 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 log0810_prepare_sql(), 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 |