2009-10-15 13 views
7

私は最近開発者として新たな地位を確立しましたが、私はPL/SQLに少し問題があります。私は何年もの間MS SQLを使用しましたが、私はPL/SQLを少しトリッキーにしています。Oracle PL/SQLのテーブル変数?

MS SQLで関数とストアドプロシージャを記述するときに私がしていたことの1つは、結果セットをテーブル変数に再作成することでしたので、プロシージャ全体で再クエリする必要はありませんでした。このような

何か:

declare @badPeople table(recordPointer int) 
insert into @badPeople 
select BP_Record_Pointer 
from People 
where BP_Bad = 1 

私はPL/SQLに似た何かをしてで探していますが、私は開始する方法は非常にわかりません。これが可能なのであれば、どんな考えですか?

+0

は多分だまされやすい人を助けるかもしれない同様の問題[http://stackoverflow.com/questions/670461/does-oracle-have-an-equivalent-of-mssqls-table-variables](http://ですstackoverflow.com/questions/670461/does-oracle-have-an-equivalent-of-mssqls-table-variables) – Gratzy

答えて

5

MS SQLとは異なり、カーソルは悪魔と思われるものではありません。したがって、通常はOracleでは、MS SQLよりも頻繁にカーソルを使用します。もちろん、SQLとカーソルが一番良いとは限りませんが、Oracleでカーソルをテストして使用することを恐れないでください。 PL/SQLの良い本を入手してください。これは良いものですhttp://www.amazon.com/Oracle-PL-SQL-Programming-4th/dp/0596009771。 Gratzyによる投稿はあなたが使うことのできる別の選択肢です。ですから、いつ何を使うべきかを理解するのに使うことができる良い本を手に入れてください。 PL/SQLは、T-SQLに比べて非常に豊富な環境です。最初の曲線を乗り越えれば学習曲線が増えますが、それは本当に簡単で力強い言語です。そしてそれの上にそれは多くの楽しみです。

10
declare 
    type t_number is table of number; 
    v_numbers t_number; 
begin 
    select BP_Record_Pointer 
    bulk collect into v_numbers 
    from People 
    where BP_Bad = 1; 
end; 

これにより、テーブルの値を含むネストした表が作成されます。匿名ブロックの終わりにテーブルが範囲外になることに注意することが重要です。そのため、そのブロック内で行う必要がある処理はすべてそのブロック内で行う必要があります。ここで

+1

+1のSQLの例 –