Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 IF <выражение1> OR <выражение2> THEN  [new]
Заботин А.
Member

Откуда: Санкт-Петербург
Сообщений: 155
Скажите, пожалуйста, можно ли быть уверенным, что в случае
IF <выражение1> OR <выражение2> THEN
Oracle вычислит выражение1, и если оно верно, то выражение2 вычислять уже не будет?
Спасибо.
6 апр 06, 16:43    [2532872]     Ответить | Цитировать Сообщить модератору
 Re: IF <выражение1> OR <выражение2> THEN  [new]
M_IV
Member

Откуда:
Сообщений: 1303
net
6 апр 06, 16:52    [2532941]     Ответить | Цитировать Сообщить модератору
 Re: IF <выражение1> OR <выражение2> THEN  [new]
Elic
Member

Откуда:
Сообщений: 29979
RTFM Short-Circuit Evaluation (FAQ)
6 апр 06, 16:52    [2532943]     Ответить | Цитировать Сообщить модератору
 Re: IF <выражение1> OR <выражение2> THEN  [new]
Maxifly
Member

Откуда:
Сообщений: 522
Простой тестик

declare 
  -- Local variables here
  function f1 return number
  is
  begin
    dbms_output.put_line(' f1');
    return 1; 
  end;

  function f2 return number
  is
  begin
    dbms_output.put_line(' f2');
    return 2; 
  end;
  
  
begin
  -- Test statements here
  dbms_output.put_line('-1-'); 
  if f1 = 1 or f2 = 1 then
   null;
  end if; 
  dbms_output.put_line('-2-'); 
  if f1 = 0 or f2 = 1 then
   null;
  end if; 
  dbms_output.put_line('-3-'); 
  if f1 = 0 and f2 = 1 then
   null;
  end if; 
  
  
end;

возвращает

-1-
f1
-2-
f1
f2
-3-
f1
6 апр 06, 16:52    [2532944]     Ответить | Цитировать Сообщить модератору
 Re: IF <выражение1> OR <выражение2> THEN  [new]
zirex
Member

Откуда:
Сообщений: 714

SQL> declare
  arg1 number := 2;
  arg2 number := 0;
begin
  if (arg1 = 1) or ((arg1 / arg2) = 0) then
    dbms_output.put_line('Mojno');
  end if;
end;  2    3    4    5    6    7    8
  9  /
declare
*
ERROR at line 1:
ORA-01476: divisor is equal to zero
ORA-06512: at line 5


SQL> declare
  arg1 number := 1;
  arg2 number := 0;
begin
  if (arg1 = 1) or ((arg1 / arg2) = 0) then
    dbms_output.put_line('Mojno');
  end if;
end;
  2    3    4    5    6    7    8    9
 10  /

PL/SQL procedure successfully completed.


6 апр 06, 16:55    [2532970]     Ответить | Цитировать Сообщить модератору
 Re: IF <выражение1> OR <выражение2> THEN  [new]
Заботин А.
Member

Откуда: Санкт-Петербург
Сообщений: 155
Спасибо!
6 апр 06, 17:02    [2533026]     Ответить | Цитировать Сообщить модератору
 Re: IF <выражение1> OR <выражение2> THEN  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18343
Заботин А.
Спасибо!

Господа, вы забыли спросить человека для чего он собирается это использовать.
Если для оптимизации - то все ок, а вот если для организации бизнес-логики - то это ничем не лучше /*+ index... */ вместо сортировки.
Бизнес-логику на побочных эффектах строить нельзя!
6 апр 06, 17:14    [2533124]     Ответить | Цитировать Сообщить модератору
 Re: IF <выражение1> OR <выражение2> THEN  [new]
zirex
Member

Откуда:
Сообщений: 714
andrey_anonymous
...на побочных эффектах строить нельзя!

о каких побочных эффектах идет речь?
6 апр 06, 17:31    [2533233]     Ответить | Цитировать Сообщить модератору
 Re: IF <выражение1> OR <выражение2> THEN  [new]
Заботин А.
Member

Откуда: Санкт-Петербург
Сообщений: 155
Буду использовать для уменьшения строк кода. Что бы не было
IF выражение1 THEN
  IF выражение2 THEN
    ...
  END IF;
END IF;
А было
IF выражение1 AND выражение2 THEN
  ...
END IF;
6 апр 06, 17:43    [2533339]     Ответить | Цитировать Сообщить модератору
 Re: IF <выражение1> OR <выражение2> THEN  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18343
Заботин А.
Буду использовать для уменьшения строк кода. Что бы не было
IF выражение1 THEN
  IF выражение2 THEN
    ...
  END IF;
END IF;
А было
IF выражение1 AND выражение2 THEN
  ...
END IF;

1. А что, сразу нельзя было?
2. Обратите внимание, что топик тут не при делах - при AND будут проверяться оба условия :)
6 апр 06, 17:46    [2533364]     Ответить | Цитировать Сообщить модератору
 Re: IF <выражение1> OR <выражение2> THEN  [new]
Заботин А.
Member

Откуда: Санкт-Петербург
Сообщений: 155
Нет, очень даже при делах. Если первое выражение false, то второе проверяться уже не будет.
6 апр 06, 17:47    [2533369]     Ответить | Цитировать Сообщить модератору
 Re: IF <выражение1> OR <выражение2> THEN  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18343
andrey_anonymous
2. Обратите внимание, что топик тут не при делах - при AND будут проверяться оба условия :)

гоню помаленьку, не обращайте :)
6 апр 06, 17:47    [2533370]     Ответить | Цитировать Сообщить модератору
 Re: IF <выражение1> OR <выражение2> THEN  [new]
M_IV
Member

Откуда:
Сообщений: 1303
Заботин А.
Буду использовать для уменьшения строк кода. Что бы не было
IF выражение1 THEN
  IF выражение2 THEN
    ...
  END IF;
END IF;
А было
IF выражение1 AND выражение2 THEN
  ...
END IF;


Kak bi potom ne prishlos' perepisivat' obratno ...
6 апр 06, 18:05    [2533483]     Ответить | Цитировать Сообщить модератору
 Re: IF <выражение1> OR <выражение2> THEN  [new]
Падонак
Member [заблокирован]

Откуда: из лесу
Сообщений: 1775
Заботин А.
Буду использовать для уменьшения строк кода. Что бы не было
IF выражение1 THEN
  IF выражение2 THEN
    ...
  END IF;
END IF;
А было
IF выражение1 AND выражение2 THEN
  ...
END IF;


тормаз нах
7 апр 06, 01:34    [2534384]     Ответить | Цитировать Сообщить модератору
 Re: IF <выражение1> OR <выражение2> THEN  [new]
Заботин А.
Member

Откуда: Санкт-Петербург
Сообщений: 155
M_IV
Заботин А.
Буду использовать для уменьшения строк кода. Что бы не было
IF выражение1 THEN
  IF выражение2 THEN
    ...
  END IF;
END IF;
А было
IF выражение1 AND выражение2 THEN
  ...
END IF;


Kak bi potom ne prishlos' perepisivat' obratno ...

Почему?
7 апр 06, 12:17    [2535811]     Ответить | Цитировать Сообщить модератору
 Re: IF <выражение1> OR <выражение2> THEN  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
Заботин А.
M_IV
Kak bi potom ne prishlos' perepisivat' obratno ...

Почему?


Видимо это из области мифов или ошибок реализации PL/SQL машины.

Short-Circuit Evaluation это документированное поведение, которым можно пользоваться в частности и для того, чтобы исключить ненужные или нежелательные (как в случае if a1=0 or 0<a2/a1 then ... без a1=0 мы рискуем получить деление на 0) вычисления.

Замечу, что

IF выражение1 THEN
  IF выражение2 THEN
    ...
  END IF;
END IF;

в общем случае не эквивалентно

IF выражение1 AND выражение2 THEN
  ...
END IF;

Например, выражение1 ::= выражение3 or выражение4. Тогда имеем

if выражение3 or выражение4 and выражение2
или
if выражение3 or (выражение4 and выражение2) then
.

Нужно писать:
IF (выражение1) AND (выражение2) THEN
  ...
END IF;

Если в блоке if есть else, нужно быть особо внимательным.
7 апр 06, 14:38    [2536787]     Ответить | Цитировать Сообщить модератору
 Re: IF <выражение1> OR <выражение2> THEN  [new]
Заботин А.
Member

Откуда: Санкт-Петербург
Сообщений: 155
Большое спасибо за разъяснение!
У меня выражение1 простое: переменная=значение. А выражение2 это сравнение ответа функции со значением, причем функция работает не очень быстро, и поэтому мне бы не хотелось что бы она постоянно вызывалась, как только в процессе выполнения процедуры дело дойдет до IF выражение1 AND выражение2 THEN.
7 апр 06, 14:49    [2536855]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить