气势凌人的伤疤 · 数据库——游标-阿里云开发者社区· 1 周前 · |
爽快的冲锋衣 · 百度知道 - 全球领先中文互动问答平台· 1 年前 · |
年轻有为的生菜 · Atlassian In ...· 1 年前 · |
从未表白的小蝌蚪 · gridstack.js API - 掘金· 1 年前 · |
英勇无比的领带 · mysql——逗号分割字段情况_mysql字 ...· 1 年前 · |
阳光的葫芦 · Docker 安装 Flood,适用于各种 ...· 1 年前 · |
我正在写下面的查询,我想显示汽车登记,汽车组名称,型号名称,成本和每辆车的预订数量。我必须使用一个显式游标,我必须使用一个隐式游标来计算属于每辆车的预订数量。
我的查询如下:
SET SERVEROUTPUT ON FORMAT WRAP SIZE 12000
Declare
v_count number;
cursor carcur IS
SELECT * FROM i_car;
v_car carcur%ROWTYPE;
Begin
Select COUNT (registration)
INTO v_count
from i_booking
group by registration;
FOR v_car IN carcur LOOP
DBMS_OUTPUT.PUT_LINE('Registration:'|| ' '|| v_car.registration);
DBMS_OUTPUT.PUT_LINE('Car Group:'|| ' ' ||v_car.car_group_name);
DBMS_OUTPUT.PUT_LINE('Model Name:'|| ' '||v_car.model_name);
DBMS_OUTPUT.PUT_LINE('Cost:'|| ' '||v_car.cost);
DBMS_OUTPUT.PUT_LINE('Total Bookings:'|| ' '||v_count);
DBMS_OUTPUT.NEW_LINE;
END LOOP;
End;
我得到的输出如下:在第1行声明*错误: ORA-01422:准确的提取返回大于请求的行数,或者-06512:在第7行
我确信这与变量中的返回值有关,但我不知道如何纠正这个问题。
如有任何建议,将不胜感激。
非常感谢。
当从select计数(注册)返回多个值时,就会发生错误,因为您要将它选择到单个变量v_count中。
如果您试图选择各种注册的所有计数,则需要为v_count使用数组类型,如下所示:
declare
v_count number;
v_counts is table of v_count
Begin
Select COUNT (registration)
bulk collect INTO v_counts
from i_booking
group by registration;
if (v_counts > 0) then
for i in v_counts.first..last loop
<do your printing>
end loop;
end if;
/
我还添加了一个使用大容量集合的优化,因为这将给您带来更快的性能。
您所面临的错误是因为您试图将多个值赋值给单个值变量。
查询返回多个值,主要是因为您使用的是
group by
。在您的示例中,
group by
所做的是为该列中的每个不同值查找
registration
列中值的总数。
假设,让我们看看一个例子-
registration | other columns ...
1 | ...
1 | ...
1 | ...
2 | ...
3 | ...
3 | ...
因此,使用
group by
查询的输出将是
registration | count(registration)
1 | 3
2 | 1
3 | 2
注意,列
registration
不是在
select
列表中选择的,而是只选择了
count(registration)
,根据该示例,
count(registration)
可以包含多个值。
所以现在有三个案子-
registration
中所有非空值的计数,只需删除
group by
子句即可。
registration
中的所有
registration
非空值,可以使用
count(distinct registration)
并删除
group by
,如下所示:
在格式包装尺寸12000上设置SERVEROUTPUT,声明v_count号;选择光标carcur *来自i_car;v_car carcur%ROWTYPE;开始从i_booking选择计数(不同注册)到v_count;对于carcur循环DBMS_OUTPUT.PUT_LINE中的v_car (‘注册:’IN:‘SERVEROUTPUT’);DBMS_OUTPUT.PUT_LINE('Car组:‘number’%ROWTYPE);DBMS_OUTPUT.PUT_LINE('Model Name:‘AC.26:’||v_car.model_name '||v_car.model_name);“DBMS_OUTPUT.PUT_LINE”(‘成本:’分部‘'||v_car.cost);DBMS_OUTPUT.PUT_LINE(“总预订量:’{##**$$}”||v_count);DBMS_OUTPUT.NEW_LINE;END循环;End;//
这对我起了作用。我将隐式SELECT语句移到游标for循环中,并添加了一个WHERE子句,该子句表示WHERE注册= v_car.registration;
SET SERVEROUTPUT ON FORMAT WRAP SIZE 12000
Declare
v_count number;
cursor carcur IS
SELECT * FROM i_car;
v_car carcur%ROWTYPE;
Begin
FOR v_car IN carcur LOOP
Select COUNT (registration)
INTO v_count
from i_booking
WHERE registration = v_car.registration;
DBMS_OUTPUT.PUT_LINE('Registration:'|| ' '|| v_car.registration);
DBMS_OUTPUT.PUT_LINE('Car Group:'|| ' ' ||v_car.car_group_name);
气势凌人的伤疤 · 数据库——游标-阿里云开发者社区 1 周前 |
爽快的冲锋衣 · 百度知道 - 全球领先中文互动问答平台 1 年前 |
从未表白的小蝌蚪 · gridstack.js API - 掘金 1 年前 |