Возврат Count и Resultset из одной хранимой процедуры - PullRequest
1 голос
/ 24 ноября 2010

Я довольно плохо знаком с хранимыми процедурами для Oracle. Я хочу иметь возможность возвращать как количество отелей, так и названия отелей за одну хранимую процедуру. Проблема в том, что я не знаю с чего начать. Любая помощь будет оценена.

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

Ответы [ 4 ]

3 голосов
/ 24 ноября 2010

Вы можете получить его за один проход:

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

Возвращает:

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

В качестве альтернативы, если вы массово собираете список в массив в памяти в PL /SQL, вы можете просто получить счет из массива с помощью функции COUNT.

1 голос
/ 24 ноября 2010

Просто показывая вам пример (если вы хотите именно то, что вам нужно, а не только почему, согласно вашему тестовому сценарию), вы можете достичь своих результатов довольно просто.Я собрал тестовый набор, чтобы показать вам

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 ;

А теперь для результатов:

/**
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;

Вы выбираете переменные , а затем открываете REFCURSOR FOR курсоры

0 голосов
/ 24 ноября 2010

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

Если количество строк будет ограничено тем, где это не так важно, вы можете воспользоваться любым из уже предоставленных вариантов или же вы можете вернуть коллекцию, содержащую названия отелей, а затем использовать атрибут .COUNT коллекции вы вернетесь, чтобы определить количество.

0 голосов
/ 24 ноября 2010
select 'count', to_char(COUNT(HNAME)) FROM HOTELS
union
select 'Hotel Name', HNAME FROM HOTELS;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...