2009-05-01 4 views
2

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

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 документации КРП и при поддержке логическое выражение, любые идеи, поддерживаются ли подзапросов в если условия.

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

ответ

5

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

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

+0

Я искал синтаксис IF и CASE по адресу http: // download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/if_statement.htm#sthref2791 и http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/case_statement.htm# sthref2511, у обоих из них было логическое выражение для условия, которое необходимо использовать. –

+0

Да, это правда. Я говорю, что разница не между IF и CASE, это между CASE, используемым как процедурный оператор, и CASE используется как выражение в выражении SQL. –

+0

Дэйв, я понял, я забыл различия в использовании CASE в SQL и PL/SQL. Поэтому я предполагаю, что использование CASE в PL/SQL таким же образом должно завершиться неудачей. –

0

Вы называли DBMS_OUTPUT.ENABLE

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

+0

Наверное, я не знал, что случилось, я отредактировал вопрос, чтобы поместить эту информацию. У меня возникла ошибка PL/SQL, проблема с dbms_output не возникает. –

+0

Ошибки PLS-00103 обычно связаны с синтаксическими ошибками; если вы положите select 'test' в оператор if, это сработает? Cant сейчас попадает в ящик oracle, чтобы проверить его сам (только у меня есть sqlserver на моем ноутбуке) – u07ch

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^