在DBViz中用独立存储过程批量插入多行时遇-811错误求解决
存储过程执行报错(SQLCODE=-811)解决
问题场景
通过存储过程从Student和teacher表关联取数,插入到temp_table时触发错误。
原存储过程代码
DELIMITER %%%; BEGIN DECLARE name CHAR (3); DECLARE subject VARCHAR(25); DECLARE ID DECIMAL(19,0); DECLARE teacher_name VARCHAR(25); insert into temp_table(std_name, subject, std_id, teacher_name) values ( SELECT std.name, std.subject, std.ID, tr.teacher_name FROM Student std inner join teacher tr on std.subject = tr.subject); END%%% DELIMITER ;
报错信息(翻译后)
[错误码: -811, SQL状态: 21000] 标量查询、SELECT INTO语句或VALUES INTO语句返回的结果行数超过一行。SQLCODE=-811, SQLSTATE=21000, DRIVER=4.22.29
错误原因
你用了INSERT INTO ... VALUES(SELECT ...)的写法,这种语法仅支持返回单行结果的查询。但Student和teacher的关联查询返回了多行数据,因此触发-811错误。
修正后的存储过程代码
DELIMITER %%% BEGIN -- 注:以下声明的变量未在当前逻辑中使用,可根据实际需求移除或复用 DECLARE name CHAR(3); DECLARE subject VARCHAR(25); DECLARE ID DECIMAL(19,0); DECLARE teacher_name VARCHAR(25); INSERT INTO temp_table(std_name, subject, std_id, teacher_name) SELECT std.name, std.subject, std.ID, tr.teacher_name FROM Student std INNER JOIN teacher tr ON std.subject = tr.subject; END%%% DELIMITER ;
关键修正点
- 移除
VALUES()包裹:批量插入多行数据时,直接用INSERT INTO ... SELECT ...是标准语法,无需通过VALUES中转 - 清理冗余变量:原存储过程中声明的变量未被使用,建议移除以避免代码冗余
内容的提问来源于stack exchange,提问作者Subathra
相关产品推荐
相关产品推荐

