EVAL, instrukcja

Instrukcja EVAL przyjmuje wartość znakową, interpretuje ją jako instrukcję SQL i przetwarza tę instrukcję.

Szczegółowe informacje na temat funkcji EVAL zawiera sekcja Funkcja EVAL.

Składnia

Odczytaj diagram składniPomiń wizualny diagram składniEVAL(wartość_znaka_SQL)

Parametr EDAL przyjmuje jeden parametr w postaci wyrażenia, wartościuje to wyrażenie i rzutuje wartość wynikową na łańcuch znaków, jeśli nie jest jeszcze jeden. Dlatego wyrażenie przekazywane do EVAL musi być reprezentowane jako łańcuch znaków.

Po zakończeniu tego pierwszego etapu wartościowania zachowanie EVAL zależy od tego, czy jest ono używane jako kompletna instrukcja ESQL, czy zamiast wyrażenia, które stanowi część instrukcji ESQL:
  • Jeśli jest to kompletna instrukcja ESQL, łańcuch znaków pochodzący z wartościowania pierwszego etapu jest przetwarzany tak, jakby był instrukcją ESQL.
  • Jeśli jest to wyrażenie, które stanowi część instrukcji ESQL, łańcuch znaków jest wartościowany tak, jakby był wyrażeniem ESQL, a EVAL zwraca wynik.

Procedury zdefiniowane przez użytkownika nie mogą być zdefiniowane w instrukcji EVAL, ale można użyć EVAL do wywołania procedury zdefiniowanej przez użytkownika, która jest w zasięgu, w którym używana jest instrukcja EVAL.

Jeśli instrukcja EVAL jest używana do wywoływania procedury zdefiniowanej przez użytkownika, która nie jest wywoływana z innego miejsca w języku ESQL dla danego węzła, należy dodać następujący kod do kodu ESQL, aby upewnić się, że wywoływana procedura zdefiniowana przez użytkownika jest uwzględniana podczas kompilowania kodu:
   IF (FALSE) THEN CALL procedure(<parameters>); END IF;
Należy zauważyć, że w poprzednim kodzie należy zastąpić łańcuch procedure() nazwą procedury, o której mowa.

W poniższych przykładach A i B są zmiennymi skalarnymi całkowitoliczbowymi, a scalarVar1 i OperatorAssą zmiennymi skalarnymi łańcucha znaków.

Poniżej przedstawiono przykłady poprawnych zastosowań EVAL:
  • SET OutputRoot.XMLNS.Data.Result = EVAL(A+B);

    Wyrażenie A + B jest akceptowalne, ponieważ pomimo tego, że zwraca wartość całkowitą, wartości całkowite są reprezentowane jako łańcuchy znaków, a konieczne rzutowanie jest wykonywane, zanim EVAL będzie kontynuować drugi etap wartościowania.

  • SET OutputRoot.XMLNS.Data.Result = EVAL('A' || operatorAsString || 'B');
  • EVAL('SET ' || scalarVar1 || ' = 2;');

    Średnik znajdujący się na końcu końcowego literału łańcuchowego jest niezbędny, ponieważ jeśli zamiast instrukcji ESQL jest używana instrukcja EVAL, jej pierwszy etap wartościowania musi zwracać łańcuch reprezentujący poprawną instrukcję ESQL, w tym średnik kończący.

Zmienne zadeklarowane w instrukcji EVAL nie istnieją poza tą instrukcją EVAL.

Prawdziwą potęgą EVAL jest to, że pozwala na dynamiczne konstruowanie instrukcji lub wyrażeń ESQL. W drugim i trzecim przykładzie powyżej wartość łańcucha scalarVar1 lub operatorAsmożna ustawić zgodnie z wartością pola komunikatu przychodzącego lub inną wartością dynamiczną, co pozwala na efektywne sterowanie przetwarzaniem kodu ESQL bez konieczności stosowania potencjalnie długiej drabiny IF-THEN.

Należy jednak wziąć pod uwagę wpływ na wydajność podczas stosowania produktu EVAL. Dynamiczne konstruowanie i przetwarzanie instrukcji lub wyrażeń jest z konieczności bardziej czasochłonne niż zwykłe przetwarzanie wstępnie skonstruowanych instrukcji lub wyrażeń. Jeśli wydajność jest istotna, preferowane może być napisanie bardziej szczegółowego, ale szybszego kodu ESQL.

Poniżej podano niepoprawne zastosowania EVAL:
  • SET EVAL(scalarVar1) = 2;

    W tym przykładzie wartość EVAL jest używana do zastąpienia odwołania do pola, a nie wyrażenia.

  • SET OutputRoot.XMLNS.Data.Result[] = EVAL((SELECT T.x FROM Database.y AS T));

    W tym przykładzie (SELECT T.x FROM Database.y) przekazany do EVAL zwraca listę, która nie jest reprezentowana jako łańcuch znaków.

Poniższy przykład jest akceptowalny, ponieważ (SELECT T.x FROM Database.y AS T) jest literałem łańcuchowym, a nie samym wyrażeniem i dlatego jest reprezentowany jako łańcuch znaków.
SET OutputRoot.XMLNS.Data.Result[]
 = EVAL('(SELECT T.x FROM Database.y AS T)');

Funkcje, które są przywoływane tylko w instrukcji EVAL, a nie w pozostałej części modułu ESQL, mogą nie być uwzględnione w pliku BAR. W poniższych przykładach funkcja MyFunction musi być przywoływana w innym miejscu w module ESQL, w przeciwnym razie wdrożenie pliku BAR może się nie powieść.

EVAL('CALL MyFunction(parm1, parm2);');
DECLARE functionName CHARACTER 'Function';
DECLARE callStmt CHARACTER 'CALL My' || functionName || '(parm1, parm2);';
EVAL(callStmt);