DELIMITER $$
USE `RTList`$$
DROP PROCEDURE IF EXISTS `INSERT_INTO_MT_Tables`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `INSERT_INTO_MT_Tables`(
IN mtTableName VARCHAR(10)
, IN mTableName VARCHAR(15)
, IN mtField VARCHAR(15)
, IN mtItemID VARCHAR(15)
, IN mtItemName VARCHAR(15)
, IN AdminID INT)
BEGIN
DECLARE @SQLString VARCHAR(200);
SET @SQLString =
'INSERT INTO ' + mtTableName +
'(' + mtItemID + ', ' + mtField + ', User_Created, Date_Created, User_Modified, Date_Modified)'
+ ' SELECT ' + mtItemID + ' , ' + mtField + ', AdminID, NOW(), AdminID, NOW()
FROM ' + mTableName + '
WHERE ' + mtField + ' = ''' + mtItemName + ''' LIMIT 1;';
PREPARE test FROM @SQLString;
EXECUTE test;
END$$
DELIMITER ;
CALL INSERT_INTO_MT_Tables('MT_Phone', 'M_Phone', 'Phone_Number', 'PhoneID', '12345678', 1);
以下是我更改后的错误消息(结束后执行cmd):
Error Code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'EXECUTE test;
DELIMITER' at line 2
以下是我更改后的错误消息(在结束前执行cmd):
Error Code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@SQLString VARCHAR(200);
SET @SQLString =
'INSERT INTO ' + mtTableName +
'(' + ' at line 9
你好,
请参阅上面的编码。我对存储过程知之甚少。 但在发布这个问题之前我试着环顾四周。 似乎cmd很简单,但仍然没有运气,我可以运行这个cmd。
你能不能告诉我我错误地写了哪些内容这样做不起作用?
非常感谢您对这个基本问题的了解。
感谢。
答案 0 :(得分:2)
在PREPARE和EXECUTE之前,您使用END $$
结束了过程定义。这些陈述应该属于程序体(在END$$
之前)。
错误的具体原因是您的PREPARE语句和EXECUTE语句在运行它们时没有被当前有效的分隔符分隔。
要解决这两个问题,只需在PREPARE和EXECUTE之后移动END $$
行。
重新评论:
您的代码还存在其他一些问题。
+
运算符不在MySQL中执行字符串连接。 (这是Microsoft SQL Server,Microsoft Access和Sybase的行为。)在MySQL中,使用CONCAT(string1, string2, ...)
或设置SQL_MODE=PIPES_AS_CONCAT
并使用||
运算符来匹配ANSI SQL语法。
您无法取消@
- 前缀user-defined variables。这些用户定义的变量类似于作用于会话的全局变量。您不需要声明它们,只需开始使用它们即可。它们接受任何长度的字符串,因此不需要声明数据类型或长度。
您必须将此类型的变量用于PREPARE,而不是使用DECLARE创建的局部变量。因此,在此过程中根本不需要DECLARE。
这是我在MySQL 5.5.30上测试过的脚本版本:
DELIMITER $$
DROP PROCEDURE IF EXISTS `INSERT_INTO_MT_Tables`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `INSERT_INTO_MT_Tables`(
IN mtTableName VARCHAR(10)
, IN mTableName VARCHAR(15)
, IN mtField VARCHAR(15)
, IN mtItemID VARCHAR(15)
, IN mtItemName VARCHAR(15)
, IN AdminID INT)
BEGIN
SET @SQLString =
CONCAT('INSERT INTO ', mtTableName,
'(', mtItemID, ', ', mtField, ', User_Created, Date_Created, User_Modified, Date_Modified)',
' SELECT ', mtItemID, ' , ', mtField, ', AdminID, NOW(), AdminID, NOW()
FROM ', mTableName, '
WHERE ', mtField, ' = ''', mtItemName, ''' LIMIT 1');
PREPARE test FROM @SQLString;
EXECUTE test;
END$$
DELIMITER ;
CALL INSERT_INTO_MT_Tables('MT_Phone', 'M_Phone', 'Phone_Number', 'PhoneID', '12345678', 1);