Mysql 将数据输入到数据和表名为动态的表中的存储过程
我一直在使用下面的代码,但我找不到哪里出了问题。我一直在运行下面的代码,它在sql语法中表示错误。请帮助我,我是mysql和存储过程的新手。 我得到的错误是:错误代码1064,您有sql语法错误Mysql 将数据输入到数据和表名为动态的表中的存储过程,mysql,stored-procedures,Mysql,Stored Procedures,我一直在使用下面的代码,但我找不到哪里出了问题。我一直在运行下面的代码,它在sql语法中表示错误。请帮助我,我是mysql和存储过程的新手。 我得到的错误是:错误代码1064,您有sql语法错误 CREATE DEFINER=`PotatoHead`@`%` PROCEDURE `InsertIntoTable`(in tablename varchar(45),in ID varchar(45),in Project
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
SET @sql = CONCAT('Insert into ', tablename ,' (ID,Project,Variant,
ReleaseVersion,
TestBenchID ,
TestCaseID ,
TestCaseNamespace ,
TestCaseName ,
TestCaseDomain ,
TestType ,
HardwareVersion ,
SoftwareVersion ,
Result ,
Comment ,
Duration ,
StartTime ,
EndTime) VALUES (');
SET @sql = CONCAT(ID,',',Project,',',Variant,',',
ReleaseVersion,',',
TestBenchID,',',
TestCaseID,',',
TestCaseNamespace ,',',
TestCaseName ,',',
TestCaseDomain ,',',
TestType ,',',
HardwareVersion ,',',
SoftwareVersion ,',',
Result ,',',
Comment ,',',
Duration ,',',
StartTime ,',',
EndTime,');');
PREPARE s FROM @sql;
EXECUTE s;
DEALLOCATE PREPARE s;
END
您有一个小的输入错误,在输入参数列表中缺少一个逗号
in Variant varchar(45)
^^^^
这是我在Workbench中运行代码时收到的完整错误消息
错误代码:1064。您的SQL语法有错误;检查
与右边的MySQL服务器版本相对应的手册
要在ReleaseVersion varchar45中使用near'的语法
第6行的TestBenchID varchar45
您编辑了错误消息的一部分,该部分将告诉您在哪里查找引用代码之前的错误
此外,如果您还没有这样做,则需要在多语句过程定义之前和之后重置分隔符,以便MySQL知道如何将整个定义视为一个
e、 g
更新
最后一个更改应该已经编译好了,所以现在我们将讨论运行时错误。我承认,我没有超出您原始代码的第一个错误,因此没有注意到其他一些问题。e、 g
对@sql变量的多次赋值,而不是串联
由concat生成的值列表中的无引号字符串
重复使用参数的列名在这里可以避免,但可能会导致意外的结果
然而,我错过的一件大事是,为什么您甚至想首先使用动态SQL来解决这个问题,除非表名要更改,否则这是不必要的。
让我们把它们按顺序排列:
将INSERT语句的第一部分分配给@sql。那很好。稍后,将值列表指定给同一变量。此时,将替换原始零件,而不是连接两个零件。这导致了您发布的第二个错误。你会用它来修好的
SET @sql = CONCAT(@sql,' VALUES(' etc.
CONCAT语句将为您留下一个字符串,其中包含VARCHAR列的16个不带引号的变量。您需要在所有这些值周围包含单引号,否则PREPARE语句将失败。你会用这个来修的
SET @sql = CONCAT(@sql, '\'',
ID,'\',\'',
Project,'\',\'',
Variant,'\',\'',
ReleaseVersion,'\',\'',
TestBenchID,'\',\'',
TestCaseID,',',
TestCaseNamespace ,'\',\'',
等等
海螺现在有点乱了,我想你会同意的
接下来是参数和表中的列名使用相同名称的问题。正如我前面提到的,在本例中,您可以不受影响,但是MySQL在确定使用哪个时会优先考虑参数名而不是列名,这可能会导致在SELECT、WHERE子句等中使用参数时出现问题。最好将两者区分开来,以避免混淆。所以,我还要重命名所有的参数。e、 g
CREATE PROCEDURE `InsertIntoTable` (
in _tablename varchar(45),
in _ID varchar(45),
in _Project varchar(45),
in _Variant varchar(45),
in _ReleaseVersion varchar(45) ,
然后相应地更新值列表。顺便说一句,由于您所有的输入参数都在参数中,这是默认值,因此您可以在每个参数之前省去“IN”,并保存一些输入
最后,介绍动态SQL的使用。我怀疑这个过程正在写入表的所有列,并且只有一个表具有这个精确的定义。如果表名不会更改,为什么需要能够在运行时更改它?如果不是这样,那么您为什么要使用多个表来存储完全相同的数据?如果我的怀疑是正确的,那么您可以完全放弃使用动态SQL,这样过程就会变得简单得多
e、 g
这更易于阅读和维护,并且不需要麻烦的字符串操作就可以完成这项工作。MySQL将负责为您引用参数,因为它现在是一个单独的语句,所以不需要开始。。。结束块并重置分隔符。它仍然不起作用,显示错误代码1064,第1行语法“ID,Project,Version”附近有错误
CREATE PROCEDURE `InsertIntoTable` (
in _tablename varchar(45),
in _ID varchar(45),
in _Project varchar(45),
in _Variant varchar(45),
in _ReleaseVersion varchar(45) ,
CREATE PROCEDURE `InsertIntoYrTablename` (
_ID varchar(45),
_Project varchar(45),
_Variant varchar(45),
_ReleaseVersion varchar(45),
_TestBenchID varchar(45),
_TestCaseID int(11),
_TestCaseNamespace varchar(100),
_TestCaseName varchar(45),
_TestCaseDomain varchar(45),
_TestType varchar(45),
_HardwareVersion varchar(4000),
_SoftwareVersion varchar(4000),
_Result varchar(45),
_Comment varchar(4000),
_Duration varchar(45),
_StartTime varchar(45),
_EndTime varchar(45))
INSERT into `yrtablename` (
ID,
Project,
Variant,
ReleaseVersion,
TestBenchID,
TestCaseID,
TestCaseNamespace,
TestCaseName,
TestCaseDomain,
TestType,
HardwareVersion,
SoftwareVersion,
Result,
Comment,
Duration,
StartTime,
EndTime
) VALUES (
_ID,
_Project,
_Variant,
_ReleaseVersion,
_TestBenchID,
_TestCaseID,
_TestCaseNamespace,
_TestCaseName,
_TestCaseDomain,
_TestType,
_HardwareVersion,
_SoftwareVersion,
_Result,
_Comment,
_Duration,
_StartTime,
_EndTime);