从单个存储过程返回Count和Resultset

时间:2010-11-24 02:41:40

标签: sql oracle stored-procedures

我对Oracle的存储过程相当新。我希望能够在一个存储过程中同时返回酒店数量和酒店名称。问题是我不知道从哪里开始。任何帮助将不胜感激。

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

4 个答案:

答案 0 :(得分:3)

你可以一次性获得它:

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

返回:

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

或者,如果您将列表批量收集到PL / SQL中的内存数组中,则可以使用COUNT函数从数组中获取计数。

答案 1 :(得分: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 ;

现在结果如下:

/**
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 游标

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这有很多选择。通常我最喜欢Thilo的想法,因为大多数情况并不真正需要知道返回的确切行数,因此每次查询运行时计算它们的成本都是不值得的。

如果行数限制在不太重要的地方,您可以执行已经提供的任何选项,或者您也可以返回包含酒店名称的集合,然后使用.COUNT属性您回来确定计数的集合。