You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 18:10:31