software‎ > ‎módulos‎ > ‎engine‎ > ‎Base de Conhecimento‎ > ‎

Erro: O Postgres retornou um erro: operator does not exist: XXX = YYY [su_e13100101]

Causa

Este erro ocorre quando existe na clausula where uma coluna de um tipo comparada a um dado de outro. O Oracle não dispararia este erro, pois realizaria cast automático.

Exemplo de consulta incorreta:

select 
LOCESCRITU, CHCRIACAO, ROMANEIONUMERO, NUMERO, EMISSAOMOV, CLASSE, REPRESENTA,
PESSOA, LOCENTREGA, TRANSPORTA, RECURSO, QUANTIDADE, TOTAL, VOLQDE, VOLPESLIQ, VOLPESBRU,
cast(null as number) as VALFRETE 
from PEDIDO 
where pedido.TIPOOPERACAO is null and pedido.ECOTACAO is null 
and   pedido.ROMANEIONUMERO = 181

Neste caso, o campo "pedido.ROMANEIONUMERO" é do tipo character varying (VARCHAR) e o dado após o sinal de igual é do tipo integer.

Exemplo de mensagem de erro completa:

Erro: The SGBD returned an error: ERROR:  operator does not exist: character varying = integer
LINE 8:          and   pedido.ROMANEIONUMERO = 181
                                           ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

Local: TiPostgresDBConnection.InternalSQLExecute

SQL expression:

      select 
      LOCESCRITU, CHCRIACAO, ROMANEIONUMERO, NUMERO, EMISSAOMOV, CLASSE, REPRESENTA,
      PESSOA, LOCENTREGA, TRANSPORTA, RECURSO, QUANTIDADE, TOTAL, VOLQDE, VOLPESLIQ, VOLPESBRU,
      cast(null as number) as VALFRETE 
      from PEDIDO 
      where pedido.TIPOOPERACAO is null and pedido.ECOTACAO is null 
       and   pedido.ROMANEIONUMERO = 181

Soluções

Como o próprio hint do erro já sugere, para resolver o problema, é necessário igualar os tipos de dados.

Solução 1 - Utilizar iQuery

__includeOnce('ufs:/ngin/iquery.js');

var sql = IQuery.from(-2008879000 /* Pedidos ou Provisões */)
  .where([
    {field: 'TIPOOPERACAO', operator:'=', value: null},
    'and',
    {field: 'ECOTACAO', operator:'=', value: null},
    'and',
    {field: 'ROMANEIONUMERO', operator:'=', value: 181}
    // observe que 181 aqui é numérico, mas o iquery identifica o tipo e coloca na query como texto
  ])
  .column([
    {field: 'LOCESCRITU'}, {field: 'CHCRIACAO'}, {field: 'ROMANEIONUMERO'},
    {field: 'NUMERO'}, {field: 'EMISSAOMOV'}, {field: 'CLASSE'},
    {field: 'REPRESENTA'}, {field: 'PESSOA'}, {field: 'LOCENTREGA'},
    {field: 'TRANSPORTA'}, {field: 'RECURSO'}, {field: 'QUANTIDADE'},
    {field: 'TOTAL'}, {field: 'VOLQDE'}, {field: 'VOLPESLIQ'},
    {field: 'VOLPESBRU'},
    {castValue: null, cast: 'number', alias: 'VALFRETE' }
  ])
  .toSql();

Solução 2 - Utilizar o javascript para realizar o cast

__includeOnce('ufs:/goog/string/string.js');

var romaneionumero = 181;
var query =
  'SELECT locescritu, chcriacao, romaneionumero, numero, emissaomov, classe,' +
  '       representa, pessoa, locentrega, transporta, recurso, quantidade,' +
  '       total, volqde, volpesliq, volpesbru, Cast(NULL AS NUMBER) AS VALFRETE ' +
  'FROM   pedido ' +
  'WHERE  pedido.tipooperacao IS NULL ' +
  '       AND pedido.ecotacao IS NULL ' +
  "       AND pedido.romaneionumero = '%s' ";
database.query(goog.string.format(query, romaneionumero));

Solução 3 - Utilizar o banco de dados para realizar o cast

var query =
  'SELECT locescritu, chcriacao, romaneionumero, numero, emissaomov, classe,' +
  '       representa, pessoa, locentrega, transporta, recurso, quantidade,' +
  '       total, volqde, volpesliq, volpesbru, Cast(NULL AS NUMBER) AS VALFRETE ' +
  'FROM   pedido ' +
  'WHERE  pedido.tipooperacao IS NULL ' +
  '       AND pedido.ecotacao IS NULL ' +
  "       AND CAST(pedido.romaneionumero AS INTEGER) = 181 ";
database.query(query);