Páginas filhas
  • log0810_prepare_sql()

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.
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 dados:Em versões mais antigas destes bancos de dados era feito desta forma o uso da condição OUTER JOIN.

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
titleCÓ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:

 


Bloco de código
titleCÓ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:

Bloco de código
titleCÓ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