我已经声明了变量(total,order_num,order_stts,id_cust,reMarks)。但它有错误,表示结果由多行组成。我该如何解决这个错误?请帮我修复这个错误,我是sql的新手。
从这段代码中可以完成以下几项任务:
(1) update tble customer by setting the address to '90 TYT' if c_id= 1
(2) view order_no,status,c_id,item_total remarks.
(3) if item_total 0, then update table order_status by setting remarks = 'UNAVAILABLE',
else select order_no,status,item_total,remarks where status = 'waiting'.
#drop procedure if exists usp_GetAnything;
delimiter //
create procedure usp_GetAnything()
begin
declare total int default 0;
declare order_num varchar(45) default 000;
declare order_stts varchar(45) default 000;
declare id_cust int default 0;
declare reMarks varchar (45) default 000;
select c_id,lname,address,city
from customer;
update customer
set address = '90 TYT'
where c_id = 1;
select o.order_no,o.o_status,c.c_id,o.item_total,o.remarks
into order_num,order_stts,id_cust,total,reMarks
from customer c, order_status o
where c.c_id=o.c_id;
if (total > 0) then
update order_status o
set reMarks = 'UNAVAILABLE'
where order_num > '123';
else
select order_num,order_stts,total,reMarks
from order_status
where order_stts = 'waiting';
end if;
end
答案 0 :(得分:2)
错误是由第二个SELECT语句中的INTO子句引起的。如果SELECT返回的行不超过一行,那就不会出错。
但是如果SELECT返回多行,MySQL将抛出1172错误。 (您可以通过在“LIMIT 1
”语句中添加“SELECT ... INTO
”子句并验证是否未引发错误来对此进行测试。
该过程运行SELECT以返回结果集,然后发出UPDATE语句以修改表中的零行或多行。
该程序的下一部分令人困惑;目前尚不清楚我们正在努力实现的目标。 SELECT可以返回零,一行或多行。如果目的是执行条件测试以确定是否有任何行item_total > 0
,
然后一个可能的“修复”(以避免1172错误)将添加
AND o.item_total > 0 LIMIT 1
到“SELECT ... INTO
”语句。
如果没有“ORDER BY
”,则返回哪一行是不确定的。但它看起来并不重要。除了返回的o.item_total
值的比较之外,对于返回的列,该过程看起来不像其他任何操作。
如果找到UPDATE
行,则只会执行以下item_total>0
语句。
UPDATE语句将更新所有行,其order_number大于指定的常量。
与前一个SELECT ... INTO
语句返回的行似乎没有任何关系。
如果想要更新order_status中的行(与客户相关),如果上一个查询返回的“any”行有item_total > 0
,则建议的“修复”将完成该操作。 / p>
然后(有条件地)过程返回第二个结果集(order_status中的所有行,其中`order_stts ='waiting'),但前提是没有任何order_status行和item_total> 0。
我们可以解决1172错误,但是这个程序比那个错误有更大的问题。整个过程似乎是解决它应该解决的任何问题的奇怪方法。它看起来像是一堆混乱的SQL语句,没有明确的设计。
答案 1 :(得分:0)
这意味着
select o.order_no,o.o_status,c.c_id,o.item_total,o.remarks
from customer c, order_status o
where c.c_id=o.c_id;
如果您尝试将结果存储在变量中,则上面的查询将返回多个不可加的行。因此,如果您不期望多行,请检查您的数据,或者如果您对第一行值没有问题,请在查询中添加限制1
select o.order_no,o.o_status,c.c_id,o.item_total,o.remarks
into order_num,order_stts,id_cust,total,reMarks
from customer c, order_status o
where c.c_id=o.c_id limit 1;
你可以尝试在Stackoverflow中搜索结果包含多行,你应该得到大量答案!!!