MySQL存储过程插入数据报错Error Code 1064的解决方法
问题分析与解决方案
嘿,我一眼就发现你这个存储过程的几个关键问题,咱们一步步来修复:
核心错误原因
- SQL拼接覆盖问题:你每次执行
SET @sql = CONCAT(...)时,都是直接替换掉了@sql的原有内容,而不是在之前的基础上追加。比如第一句拼了Insert into 表名,下一句直接把@sql改成ID,Project,Variant,,前面的Insert into直接丢失,最终拼接出的SQL完全残缺,这是语法错误的根源。 - 字符串参数未加引号:所有varchar类型的参数(比如
ID、Project)在拼接VALUES时没有用单引号包裹,MySQL会把它们识别为列名或关键字,导致语法错误。 - 括号拼接不完整:字段列表开头缺少左括号,VALUES部分的括号位置也没处理正确。
修正后的存储过程
CREATE DEFINER=`PotatoHead`@`%` PROCEDURE `InsertIntoTable`( in tablename varchar(45), in ID varchar(45), in Project varchar(45), in Variant varchar(45), in ReleaseVersion varchar(45), in TestBenchID varchar(45), in TestCaseID int(11), in TestCaseNamespace varchar(100), in TestCaseName varchar(45), in TestCaseDomain varchar(45), in TestType varchar(45), in HardwareVersion varchar(4000), in SoftwareVersion varchar(4000), in Result varchar(45), in Comment varchar(4000), in Duration varchar(45), in StartTime varchar(45), in EndTime varchar(45) ) BEGIN -- 初始化SQL,拼接Insert语句开头和左括号 SET @sql = CONCAT('INSERT INTO ', tablename, ' ('); -- 追加字段列表,注意保留之前的@sql内容 SET @sql = CONCAT(@sql, 'ID, Project, Variant,'); SET @sql = CONCAT(@sql, 'ReleaseVersion,'); SET @sql = CONCAT(@sql, 'TestBenchID,'); SET @sql = CONCAT(@sql, 'TestCaseID,'); SET @sql = CONCAT(@sql, 'TestCaseNamespace,'); SET @sql = CONCAT(@sql, 'TestCaseName,'); SET @sql = CONCAT(@sql, 'TestCaseDomain,'); SET @sql = CONCAT(@sql, 'TestType,'); SET @sql = CONCAT(@sql, 'HardwareVersion,'); SET @sql = CONCAT(@sql, 'SoftwareVersion,'); SET @sql = CONCAT(@sql, 'Result,'); SET @sql = CONCAT(@sql, 'Comment,'); SET @sql = CONCAT(@sql, 'Duration,'); SET @sql = CONCAT(@sql, 'StartTime, EndTime) VALUES ('); -- 拼接VALUES部分,字符串参数加单引号,转义内部单引号 SET @sql = CONCAT(@sql, '''', REPLACE(ID, '''', ''''''), ''','); SET @sql = CONCAT(@sql, '''', REPLACE(Project, '''', ''''''), ''','); SET @sql = CONCAT(@sql, '''', REPLACE(Variant, '''', ''''''), ''','); SET @sql = CONCAT(@sql, '''', REPLACE(ReleaseVersion, '''', ''''''), ''','); SET @sql = CONCAT(@sql, '''', REPLACE(TestBenchID, '''', ''''''), ''','); SET @sql = CONCAT(@sql, TestCaseID, ','); -- int类型无需加引号 SET @sql = CONCAT(@sql, '''', REPLACE(TestCaseNamespace, '''', ''''''), ''','); SET @sql = CONCAT(@sql, '''', REPLACE(TestCaseName, '''', ''''''), ''','); SET @sql = CONCAT(@sql, '''', REPLACE(TestCaseDomain, '''', ''''''), ''','); SET @sql = CONCAT(@sql, '''', REPLACE(TestType, '''', ''''''), ''','); SET @sql = CONCAT(@sql, '''', REPLACE(HardwareVersion, '''', ''''''), ''','); SET @sql = CONCAT(@sql, '''', REPLACE(SoftwareVersion, '''', ''''''), ''','); SET @sql = CONCAT(@sql, '''', REPLACE(Result, '''', ''''''), ''','); SET @sql = CONCAT(@sql, '''', REPLACE(Comment, '''', ''''''), ''','); SET @sql = CONCAT(@sql, '''', REPLACE(Duration, '''', ''''''), ''','); SET @sql = CONCAT(@sql, '''', REPLACE(StartTime, '''', ''''''), ''','); SET @sql = CONCAT(@sql, '''', REPLACE(EndTime, '''', ''''''), ');'); PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s; END
关键修改点说明
- 累加式拼接:每次
CONCAT都把原有的@sql作为第一个参数,确保SQL语句逐步完整构建。 - 字符串参数转义:用
REPLACE(参数, '''', '''''')处理参数中的单引号,避免SQL注入和语法错误,同时给字符串参数包裹单引号。 - 括号补全:在表名后添加左括号,字段列表结尾添加右括号,VALUES部分的括号也正确闭合。
- int类型处理:
TestCaseID是int类型,直接拼接无需加引号。
验证调用
你原来的调用语句可以直接使用,现在执行:
Call InsertIntoTable('oablp1992','id','project','variant', 'releaseversion', 'testbenchid', 1, 'testcasenamespace', 'testcasename', 'Domain', 'type', 'hardware', 'software', 'result', 'comment', 'Duration', 'starttime', 'endtime');
就能正常插入数据了。
内容的提问来源于stack exchange,提问作者akanksha
相关产品推荐
相关产品推荐

