скалярный подзапрос в условии if в PL / SQL - PullRequest
2 голосов
/ 01 мая 2009

У меня есть блок If Statement, аналогичный приведенному ниже, который завершается с ошибкой - PLS-00103: Обнаружен символ «ВЫБОР» при ожидании одного из следующих действий.

Begin
    If (select count(*) from Table1) > 0 then
        dbms_output.put_line('Test');
    end if;
end;

У меня есть похожая инструкция Case, которая отлично работает

select 
case 
    when (select count(*) from Table1) > 0
        then 2
    else
        1
end
from dual

Из того, что я прочитал в документации Oracle, если и когда поддерживается булево выражение, любые идеи, поддерживаются ли подзапросы в условиях If.

Примечание: Утверждения были упрощены, я не собираюсь получать счетчик всей таблицы, так что никаких предложений по оптимизации, пожалуйста

Ответы [ 3 ]

5 голосов
/ 01 мая 2009

Нет, вы не можете использовать SELECT так, как хотите.

В вашем примере с использованием CASE вы не используете «оператор» CASE - вы используете выражение CASE , которое встраивается в оператор SQL. В этом случае вы можете использовать подзапрос, потому что он находится в контексте оператора SQL, а не в процедурном выражении. Вы не сможете использовать подобный подзапрос в процедурном операторе CASE.

0 голосов
/ 01 мая 2009

Я не верю, что подзапросы поддерживаются в условиях IF ... PL / SQL будет ожидать, что SELECT предоставит ему набор записей, а не одно значение, которое будет использоваться в выражении / выражении.

0 голосов
/ 01 мая 2009

Вы уже позвонили в DBMS_OUTPUT.ENABLE

Быстрый пример

BEGIN
DBMS_OUTPUT.DISABLE;
DBMS_OUTPUT.PUT_LINE('Disabled');
DBMS_OUTPUT.ENABLE;
DBMS_OUTPUT.PUT_LINE('Enabled');
END;
...