【问题标题】:Can't create stored procedure mysql maybe if else syntax无法创建存储过程 mysql 可能是 if else 语法
【发布时间】:2016-11-09 06:35:22
【问题描述】:

我尝试编写这样的存储过程,但它不起作用:

DROP PROCEDURE IF EXISTS `my_test`;
CREATE PROCEDURE `my_test`(
  IN my_in_var VARCHAR(255),
  OUT my_out_var VARCHAR(255)
)
BEGIN
  IF(in_var == 'my_in_value') THEN
    SET my_out_var = 'my_out_value1';
  ELSE
    SET my_out_var = 'my_out_value2';
  END IF;
END

我尝试使用 PDO 从 php 执行

$conn = new PDO("mysql:host=".$mysql_host.";dbname=".$mysql_bd, $mysql_user, $mysql_password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->exec($sql);

没有错误,但我在 MySql 服务器上看不到它

SHOW CREATE PROCEDURE my_test

所以我尝试将其复制粘贴到 phpmyadmin 的 SQL 窗口中,但出现以下语法错误:

1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获得在 '== 'my_in_value' 附近使用的正确语法)然后 SET my_out_var = 'my_out_value1'' 在第 6 行

什么是正确的语法?为什么 PDO 不显示错误?

欢迎任何帮助 - 谢谢

【问题讨论】:

  • 缺少包装DELIMITER ?
  • 你试过用=代替==吗?
  • 是的,如果你修复它可以保存
  • 你试图执行什么?通过 PDO 创建或运行它(不存在)?
  • 顺便说一句,你没有in_var

标签: php mysql stored-procedures pdo


【解决方案1】:

注意,有人向我指出,在我不使用的 PHPMyAdmin 中,下面的 DELIMITER 不是必需的。所以,DELIMITER 是一个客户端的东西,比如 MySQL Workbench 之类的需要。

存储过程:

DROP PROCEDURE IF EXISTS `my_test`;
DELIMITER $$
CREATE PROCEDURE `my_test`(
  IN my_in_var VARCHAR(255),
  OUT my_out_var VARCHAR(255)
)
BEGIN
  IF (my_in_var = 'my_in_value') THEN
    SET my_out_var = 'my_out_value1';
  ELSE
    SET my_out_var = 'my_out_value2';
  END IF;
END$$
DELIMITER ;

测试:

set @outme='';
call my_test('lizard',@outme);
select @outme;
-- my_out_value2

set @outme='';
call my_test('my_in_value',@outme);
select @outme;
-- my_out_value1

所以你需要弄清楚你对上述内容的意图是什么。

您在使用双精度 = 时出现语法错误。您可能在in_var 中有一个不存在的错字。

PHPMyAdmin(我被告知不需要 DELIMITER):

DROP PROCEDURE IF EXISTS `my_test`;
CREATE PROCEDURE `my_test`(
  IN my_in_var VARCHAR(255),
  OUT my_out_var VARCHAR(255)
)
BEGIN
  IF (my_in_var = 'my_in_value') THEN
    SET my_out_var = 'my_out_value1';
  ELSE
    SET my_out_var = 'my_out_value2';
  END IF;
END

【讨论】:

  • 我想要的是在 PHP 中设置 $my_in_value ... 将其发送到 SP 并从 SP 获取 @my_out_var 值以在 PHP 中使用。但首先我需要创建存储过程......所以首先我尝试解决这个问题
  • 好吧,在所有这些中可能没有@my_out_var 和 php 的概念。您可能会完全从 PHP 中进出。为什么会有一个@var ...我只是将其作为一个示例从需要证明它的mysql客户端内部调用它来展示
  • 所以,你写了一个存储过程。用蝴蝶结包起来。它可以从任何体面的环境中调用,如 java、c#、PHP、python 等
  • 好的。谢谢...我现在已经尝试过,它也可以使用 PDO...我不知道为什么...在出现错误之前...和[这篇文章](stackoverflow.com/questions/18409755/…)...让我困惑。
猜你喜欢
  • 2018-05-23
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 2020-01-10
相关资源
最近更新 更多