2009-05-01 24 views
2

エラーが発生した以下のようなIfステートメントブロックがあります。 PLS-00103:次のいずれかが予想される場合、シンボル "SELECT"が検出されました。 。ifステートメントのスカラーサブクエリ

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

は、私は私がOracleドキュメントで読んだものから

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

正常に動作し同様のCaseステートメントを持っている場合は、いつサポートブール式、サブクエリは、If条件にサポートされているかどうか任意のアイデア。

注:文簡素化されました、私は本当に何の最適化の提案はしてください

答えて

5

いいえ、希望どおりにSELECTを使用することはできません。

CASEを使用している例では、CASE "statement"を使用していません - CASE を使用しています。これはたまたまSQL文に埋め込まれています。その場合、プロシージャ文ではなくSQL文のコンテキスト内にあるため、サブクエリを使用できます。手続き型CASE文では、このようなサブクエリを使用することはできません。

+0

http://でIFとCASEの構文を調べました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とSQL文内の式として使用されるCASEの間にあります。 –

+0

Dave、私はあなたを得ました、SQLとPL/SQLのCASEの使い方の違いを忘れました。だから私は同じ方法で失敗する必要がありますPL/SQLでCASEを使用すると思います。 –

0

はクイック例に

をDBMS_OUTPUT.ENABLE

と呼ばれていない、テーブル全体のカウントを取得するつもりはありません
BEGIN 
DBMS_OUTPUT.DISABLE; 
DBMS_OUTPUT.PUT_LINE('Disabled'); 
DBMS_OUTPUT.ENABLE; 
DBMS_OUTPUT.PUT_LINE('Enabled'); 
END; 
+0

私は何が失敗しているのかはっきりしていなかったと思います。その情報を入れるために質問を編集しました。 PL/SQLエラーが発生しましたが、dbms_outputに問題はありません。 –

+0

PLS-00103のエラーは通常、構文エラーに関連しています。あなたが選択した 'テスト'をif文に入れると、それは動作するのですか?今日は自分でテストするためにoracle boxに入っています(私のラップトップではsqlserverのみ) – u07ch

0

IF条件でサブクエリがサポートされているとは思われません... PL/SQLは、SELECTがレコード/セットに使用する単一の値ではなくレコードのセットを与えることを期待していますt。