A instrução EVAL utiliza um valor do caractere, o interpreta como uma instrução SQL e processa essa instrução.
Para obter detalhes da função EVAL, consulte Função EVAL.
EVAL toma um parâmetro na forma de uma expressão, avalia essa expressão e lança o valor resultante em uma cadeia de caracteres, se já não for uma. Portanto, a expressão transmitida para EVAL deve poder ser representada como uma cadeia de caracteres.
Os procedimentos definidos pelo usuário não podem ser definidos em uma instrução EVAL mas EVAL pode ser usado para chamar um procedimento definido pelo usuário que está no escopo em que a instrução EVAL é usada.
IF (FALSE) THEN CALL procedure(<parameters>); END IF;
Observe que, no código precedente, você deve substituir procedure() pelo
procedimento nomeado em questão.Nos exemplos a seguir, A e B são variáveis escalares inteiras e scalarVar1 e OperatorAsString são variáveis escalares da cadeia de caracteres.
A expressão A+B é aceitável porque, embora retorne um valor inteiro, os valores inteiros podem ser representados como cadeias de caracteres e o lançamento necessário é realizado antes que EVAL continue com o segundo estágio da sua avaliação.
O ponto-e-vírgula colocado no fim do literal da cadeia final é necessário porque, se EVAL estiver sendo utilizado no lugar de uma instrução ESQL, a avaliação do seu primeiro estágio deve retornar uma cadeia que represente uma instrução ESQL válida, incluindo o ponto-e-vírgula de encerramento.
Variáveis declaradas em uma instrução EVAL não existem fora dessa instrução EVAL.
A capacidade real de EVAL é que ela permite construir dinamicamente instruções ou expressões ESQL. No segundo e terceiro exemplos acima, o valor de scalarVar1 ou operatorAsString pode ser configurado de acordo com o valor de um campo de mensagem recebida, ou outro valor dinâmico, permitindo que você controle efetivamente qual ESQL é processada sem precisar de um uma expressão IF-THEN potencialmente comprida.
No entanto, considere as implicações de desempenho na utilização de EVAL. A construção e o processamento de instruções ou expressões dinâmicos são necessariamente mais demorados que simplesmente processar aquelas pré-construídas. Se o desempenho for vital, prefira escrever ESQL mais específico, porém mais rápido.
Neste exemplo, EVAL está sendo utilizado para substituir uma referência de campo, não uma expressão.
Neste exemplo, (SELECT T.x FROM Database.y) transmitido para EVAL retorna uma lista, que não é representável como uma cadeia de caracteres.
SET OutputRoot.XMLNS.Data.Result[]
= EVAL('(SELECT T.x FROM Database.y AS T)');
As funções que são referenciadas somente em uma instrução EVAL e não no resto do módulo ESQL, podem não estar incluídas no arquivo BAR. Nos exemplos a seguir, a função MyFunction deve ser referenciada em algum outro local no módulo ESQL, caso contrário, o arquivo BAR pode falhar para implementar.
EVAL('CALL MyFunction(parm1, parm2);');
DECLARE functionName CHARACTER 'Function';
DECLARE callStmt CHARACTER 'CALL My' || functionName || '(parm1, parm2);';
EVAL(callStmt);