Páginas filhas
  • log0810_prepare_sql()

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
CÓDIGO ANTIGO
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:


CÓDIGO NOVO (Solução 1)
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:

CÓDIGO NOVO (Solução 2)
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