为什么我不能在PHP中创建MySQL存储过程?

时间:2018-09-29 20:05:46

标签: php mysql stored-procedures

我尝试使用以下代码创建存储的过程:

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语法有错误;请参阅附录A。检查与您的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”选项卡中运行代码时,是否错过了上面代码中必不可少的内容?

预先感谢:)

1 个答案:

答案 0 :(得分:2)

  • 在尝试使用应用程序代码创建存储过程时,无需重新定义定界符。
  • 此外,为避免在某些情况下出现异常,请在创建过程语句之前调用DROP PROCEDURE IF EXISTS

请执行以下操作:

// 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);