2016-09-12 8 views
0

ためにSELECT INTOが必要になります。なぜOracleは、私は次の簡単なコードを持っている通常のクエリ

declare 
var number; 

Begin 
    var := 1; 
    select * from Table where Table_ID = :var; 
end; 

が、私はエラー

はINTO句このSELECT文で期待されている受信、というの実行を

私だけではなく、それを入力すると...

select * from Table where Table_ID = 1; 

...それが動作します!

どこからエラーが発生していますか?なぜInto句が必要なのですか?

答えて

5

これは「通常の」クエリではありません。これはPL/SQLコード・ブロック内の問合せです。そして、そのようなブロックは結果を出力する方法を知らない。

INTO句を指定すると、PL/SQLは結果をどのように処理するかを知っています。これを変数に入れます。

+0

T-SQLから来てくれてありがとうございました。 「選択する」とは、別のものに使用します。 – Enrique

2

Oracleには2種類のエンジンが搭載されています。 1)SQLエンジンと2)PLSQLエンジン。 あなたは、単に

select * from Table where Table_ID = 1; 

SQLエンジンを入力し、ここで再生し、出力を取り出します。そして、あなたはここで何の問題も見ません。匿名ブロックを実行すると

は:

declare 
var number; 

Begin 

    var := 1; 
    select * from Test where A = :var; 
end; 

フェッチ操作は2つの段階で行われます。最初のPLSQLエンジンは、コマンドの構文をチェックし、プログラムで宣言された変数を解決して、そのコントロールをSQLエンジンに渡します。この現象をコンテキストスイッチングといいます。 SQLエンジンから取得した結果セットを直接表示するためのPLSQLの規定はありません。したがって、問題が発生します。 変数を宣言すると、SQLエンジンは結果セットを宣言された変数にバインドし、dbs_ouput.put_line pacakageを使用して結果を表示できます。