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
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.
- 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.
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.
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.
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.
(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);