2010-11-24 13 views
1

Oracleのストアド・プロシージャはかなり新しいです。 1つのストアドプロシージャでホテルの数とホテル名の両方を返すことができるようにしたいと考えています。問題はどこから始めるべきかわからないことです。どんな助けもありがとう。単一のストアド・プロシージャからのカウントと結果セットの返却

SELECT COUNT(HNAME) FROM HOTELS; //returns 'There are 30 hotels' 
SELECT HNAME FROM HOTELS; //returns a table of 30 hotel names 
+2

そこにはいくつのホテルがありますか?わずか30の場合は、結果セットを返し、クライアントコードでカウントします。ページングする必要がある場合(つまり、クライアントに完全なデータを返すことができない場合)に限り、サーバー側のカウントが心配です。 – Thilo

答えて

1

例を示しています(もしあなたが望むのは、テストケースごとの理由だけではなく、なぜそうだと思いますか?)、結果を非常に簡単に達成できます。私は

create table HOTELS (hname varchar2(50)) ; --create table for test 

declare --put data into it for test 
i number ; 
begin 
    for i in 1 .. 50 loop 
    insert into hotels (hname) values('Hotel: ' || i); 
    end loop ; 
    commit ; 
end ; 
/

は、プロシージャを作成し、その結果に結果を得るために

set serveroutput on 
declare 
resultQuery sys_refcursor ; 
countOfHotels number ; 
hotelName HOTELS.hname%type ; 
procedure getHotels(HotelCount out number , 
          HotelList out nocopy sys_refcursor) is 
          begin 
           select count(*) 
            into HotelCount 
            FROM HOTELS ; 

            open HOTELLIST For 
            select * 
             from HOTELS ; 
          end getHotels; 
begin 
    getHotels(countOfHotels, resultQuery) ; 

     dbms_output.put_line('Count Of Hotels ' || countOfHotels); 
     loop 
     fetch resultQuery into hotelName; 
     exit when resultQuery%notfound; 
     dbms_output.put_line('Found Hotel: ' || hotelName); 
     end loop; 

end ; 

そして今を表示--nowをお見せするために一緒にテストケースを置く:

/** 
results 
Count Of Hotels 50 
Found Hotel: Hotel: 1 
Found Hotel: Hotel: 2 
Found Hotel: Hotel: 3 
Found Hotel: Hotel: 4 
Found Hotel: Hotel: 5 
.... 

**/ 

が、すべての作業ここで行われます:

procedure getHotels(HotelCount out number , 
          HotelList out nocopy sys_refcursor) is 
    begin 
     select count(*) 
      into HotelCount 
      FROM HOTELS ; 

      open HOTELLIST For 
      select * 
       from HOTELS ; 
    end getHotels; 

You 変数に選択オープンREFCURSOR FORカーソル

+0

どうもありがとうございました。私はこれで多くを学びました。 – OneSneakyMofo

0
select 'count', to_char(COUNT(HNAME)) FROM HOTELS 
union 
select 'Hotel Name', HNAME FROM HOTELS; 
3

あなたは1回のパスでそれを得ることができます:あなたはバルクメモリ内の配列にリストを収集している場合

また
HNAME COUNTOVER 
======= ========= 
bla    30 
daa    30 
gaa    30 
... 

、:

SELECT HNAME, COUNT(*) OVER() FROM HOTELS; 

戻り値PL/SQLでは、COUNT関数を使用して配列からカウントを取得できます。

0

これには多くのオプションがあります。通常、私はThiloのアイデアが気に入っています。ほとんどの状況で返される行の正確な数を実際に知る必要はないため、クエリが実行されるたびにそれらを数える価値はありません。

行数がこれほど懸念されない場所に限定されている場合は、すでに指定されているオプションを実行することもできますし、ホテル名を含むコレクションを返すこともできます。コレクションの属性を使用してカウントを決定します。