Порядок оценки PL / SQL - PullRequest
       25

Порядок оценки PL / SQL

4 голосов
/ 09 октября 2008

Хауди. Учтите следующее:

SQL> DECLARE
  2     b1   BOOLEAN;
  3     b2   BOOLEAN;
  4     FUNCTION checkit RETURN BOOLEAN IS
  5     BEGIN
  6        dbms_output.put_line('inside checkit');
  7        RETURN TRUE;
  8     END checkit;
  9  
 10     PROCEDURE outp(n VARCHAR2, p BOOLEAN) IS
 11     BEGIN
 12        IF p THEN
 13           dbms_output.put_line(n||' is true');
 14        ELSE
 15           dbms_output.put_line(n||' is false');
 16        END IF;
 17     END;
 18  BEGIN
 19     b1 := TRUE OR checkit;
 20     outp('b1',b1);
 21     b2 := checkit OR TRUE;
 22     outp('b2',b2);
 23  END;
 24  /

b1 is true
inside checkit
b2 is true

PL/SQL procedure successfully completed

SQL> 

Обратите внимание, что результаты операторов OR зависят от порядка. Если я сначала помещу вызов функции, то функция выполняется независимо от значения другого члена. Похоже, что оператор OR оценивается слева направо до тех пор, пока не будет получено значение ИСТИНА, и в этот момент обработка останавливается, а результат становится ИСТИНОЙ

Мой вопрос: могу ли я на это положиться? Или это поведение может измениться в будущих выпусках PL / SQL? Если бы это могло измениться, есть ли способ заставить функцию быть оцененной, на которую я могу положиться (без создания другой переменной и использования отдельного оператора присваивания)?

Ответы [ 6 ]

9 голосов
/ 09 октября 2008

Да. PL / SQL выполняет оценку короткого замыкания логических выражений слева направо.

1 голос
/ 09 октября 2008

В документации говорится, что оценка короткого замыкания применима к выражениям IF, CASE и CASE: могу поспорить, что она также применяется в приведенном вами примере, но технически не документирована, что это так. Возможно, стоит поднять билет с Oracle на это поведение, чтобы получить подтверждение.

1 голос
/ 09 октября 2008

Если бы это могло измениться, есть ли способ заставить функцию оцениваться, на которую я могу положиться (без создания другой переменной и использования отдельного оператора присваивания)?

Если вам требуется, чтобы функция была оценена, даже если это логически излишне, это означает, что она делает что-то иное, чем просто возврат TRUE или FALSE, например возможно, это обновляет таблицу. Не считается хорошей практикой для функций PL / SQL иметь такие «побочные эффекты».

0 голосов
/ 05 марта 2010

что именно вы подразумеваете под "..и AND заявлениями справа налево"?
это из документации оракула =>

В следующем примере обратите внимание, что когда значение valid имеет значение FALSE, все выражение возвращает FALSE независимо от значения done:

действителен и готов

Вы можете проверить заказ в следующем примере:

ОБЪЯВИТЬ
b1 BOOLEAN;
b2 BOOLEAN;

ФУНКЦИЯ checkit (v НОМЕР)
ВОЗВРАЩАЕТСЯ БУЛАН
IS
НАЧАТЬ
DBMS_OUTPUT.put_line ('внутри проверки:' || v);
ВОЗВРАТ ИСТИНА;
КОНЕЦ проверки;

ПРОЦЕДУРА outp (n VARCHAR2, p BOOLEAN)
IS
НАЧАТЬ
ЕСЛИ р
ТОГДА
DBMS_OUTPUT.put_line (n || 'true');
ELSE
DBMS_OUTPUT.put_line (n || 'является ложным');
END IF;
END;
НАЧАТЬ
b1: = checkit (1) И checkit (2);
outp ('b1', b1);
b2: = checkit (3) И checkit (4);
outp ('b2', b2);
END;


внутри чека: 1
внутренний чек: 2
b1 верно
внутри чекит: 3
внутренний чек: 4
b2 верно

0 голосов
/ 28 февраля 2009

Он оценивает операторы OR слева направо и операторы AND справа налево. Я не нашел себе никакой документации об этом.

0 голосов
/ 09 октября 2008

Это называется "оценкой короткого замыкания", и это норма для большинства языков, , включая PL / SQL .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...