我对Oracle的存储过程相当新。我希望能够在一个存储过程中同时返回酒店数量和酒店名称。问题是我不知道从哪里开始。任何帮助将不胜感激。
SELECT COUNT(HNAME) FROM HOTELS; //returns 'There are 30 hotels'
SELECT HNAME FROM HOTELS; //returns a table of 30 hotel names
答案 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属性您回来确定计数的集合。