php - 为什么我不能在 PHP 中创建 MySQL 存储过程?
问题描述
我尝试使用以下代码创建存储过程:
DELIMITER //
CREATE PROCEDURE AddTrickBaseInvert(
IN invertName VARCHAR(16),
IN invertType TINYINT(1)
)
BEGIN
INSERT INTO trick_bases (type)
VALUES (1);
INSERT INTO trick_bases_invert (
baseId,
name,
type
)
VALUES (
LAST_INSERT_ID(),
name,
type
);
END //
DELIMITER ;
当我尝试在 localhost/phpmyadmin/ 上运行 MySQL 测试时它起作用了,但是当我尝试通过 PHP 使用相同的 SQL 代码创建相同的过程时,它给了我以下错误:
致命错误:未捕获的 PDOException:SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 1 行的“DELIMITER $$ CREATE PROCEDURE AddTrickBaseInvert(IN invertName”附近使用正确的语法...
PHP代码在这里:
$sql = '
DELIMITER //
CREATE PROCEDURE AddTrickBaseInvert(
IN invertName VARCHAR(16),
IN invertType TINYINT(1)
)
BEGIN
INSERT INTO trick_bases (type)
VALUES (1);
INSERT INTO trick_bases_invert (
baseId,
name,
type
)
VALUES (
LAST_INSERT_ID(),
name,
type
);
END //
DELIMITER ;';
$oDb->exec($sql);
如您所见,SQL 代码完全相同,但不知何故该过程没有被创建。我试图做研究,但我还没有找到任何答案。当我在 localhost/phpmyadmin 的 SQL 选项卡中运行代码时,我是否遗漏了上面代码中的一些重要内容?
提前致谢 :)
解决方案
- 在尝试使用应用程序代码创建存储过程时,您不需要重新定义分隔符。
- 此外,为避免在某些情况下出现异常,请
DROP PROCEDURE IF EXISTS
在 Create procedure 语句之前调用。
请改为执行以下操作:
// drop if procedure exists already or not
$sql_drop = 'DROP PROCEDURE IF EXISTS AddTrickBaseInvert';
$oDb->exec($sql_drop);
// Now call create procedure statement
$sql = '
CREATE PROCEDURE AddTrickBaseInvert(
IN invertName VARCHAR(16),
IN invertType TINYINT(1)
)
BEGIN
INSERT INTO trick_bases (type)
VALUES (1);
INSERT INTO trick_bases_invert (
baseId,
name,
type
)
VALUES (
LAST_INSERT_ID(),
name,
type
);
END';
$oDb->exec($sql);
推荐阅读
- swift - 我在 Swift 中遇到 ł、ó、ą 类型字符的问题
- excel - 如何旋转图像并将其移动到特定位置?
- android - 如何从 android.googlesource.com 导入 Android Studio 项目?
- java - 如何在休眠验证器引擎中指定时间范围?
- php - 路由 [verification.resend] 未定义
- node.js - 如何修复:“错误 fsevents@2.0.7:平台“linux”与此模块不兼容。”
- javascript - axios 调用从第一个 api 获取响应并传递到第二个 api
- c++ - 如何在 OpenGL 窗口中获取 Unity 上下文
- java - 找到“消息:”后如何停止正则表达式?
- php - php中SQL等效的NOT IN运算符