gpt4 book ai didi

mysql - 无法在 MYSQL 存储过程中运行 exec 命令

转载 作者:行者123 更新时间:2023-11-29 08:31:44 26 4
gpt4 key购买 nike

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。

你能告诉我哪里写错了所以这不起作用吗?

非常感谢您对这个基本问题的了解。

谢谢。

最佳答案

在 PREPARE 和 EXECUTE 之前,您以 END $$ 结束过程定义。这些语句应该属于过程主体内部(在 END$$ 之前)。

错误的具体原因是您的 PREPARE 语句和 EXECUTE 语句在运行时没有用当前有效的分隔符分隔。

要解决这两个问题,只需将带有 END $$ 的行移到 PREPARE 和 EXECUTE 之后即可。

<小时/>

回复您的评论:

您的代码还存在一些其他问题。

+ 运算符在 MySQL 中不执行字符串连接。 (这是 Microsoft SQL Server、Microsoft Access 和 Sybase 的行为。)在 MySQL 中,使用 CONCAT(string1, string2, ...) 或设置 SQL_MODE=PIPES_AS_CONCAT 并使用 || 运算符来匹配 ANSI SQL 语法。

您不能声明以 @ 为前缀的 user-defined variables 。这些用户定义的变量有点像 session 范围内的全局变量。您不需要声明它们,只需开始使用它们即可。它们接受任何长度的字符串,因此无需声明数据类型或长度。

您必须使用此类变量进行 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);

关于mysql - 无法在 MYSQL 存储过程中运行 exec 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16382030/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com