【问题标题】:MySQL - Storing variables inside CREATE FUNCTIONMySQL - 在 CREATE FUNCTION 中存储变量
【发布时间】:2016-04-08 09:25:32
【问题描述】:

我试图弄清楚如何在 mySQL 的函数中存储变量。我正在尝试创建一个将字段名称大写的函数。如果我不创建变量,则创建函数有效。问题是这很难阅读,而且很容易出错。

CREATE FUNCTION capitalize(string TEXT)
    RETURNS TEXT
    RETURN CONCAT(UPPER(LEFT(string,1)), LOWER(RIGHT(string, LENGTH(string) - 1)));

当我尝试使用 DECLARESET 关键字添加变量时,它不再起作用。

CREATE FUNCTION capitalize(string TEXT)
    RETURNS TEXT
    DECLARE first_letter TEXT;
    DECLARE last_letters TEXT;
    SET first_letter = UPPER(LEFT(string,1));
    SET last_letters = LOWER(RIGHT(string, LENGTH(string) - 1));
    RETURN CONCAT(first_letter, last_letters);

我收到此错误消息

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在第 4 行的 '' 附近使用

我已经摆弄了它,删除了分号,并双重/三重检查括号。我摆弄过BEGINEND 语句,但似乎没有任何效果。

我已就该主题进行了广泛搜索,但无法找出问题所在。

【问题讨论】:

  • 是否允许多次声明?您可以使用单个 declare... 声明多个变量
  • 你用什么 MySQL 客户端来创建这个?您可能需要先添加BEGIN/END,然后再添加specify an alternate delimiter. 做这两件事,我就能创建您的函数。
  • 把所有东西都删掉。添加命令以返回字符串。如果成功运行,请一一取消注释命令,直到错误再次出现。
  • @MichaelBerkowski 不,你没有。这是工作示例的 SQLFiddle。 sqlfiddle.com/#!9/b1e9e
  • @RichardHamilton 是的。该版本的函数只执行一个 SQL 语句。变量声明使它成为一个多语句体,这意味着你需要一个BEGIN/END

标签: mysql sql function syntax


【解决方案1】:

CREATE FUNCTION 的主体只能包含一个语句,这就是为什么第一个版本有效而​​第二个版本无效的原因。幸运的是,该单个语句可以是包含在 BEGIN ... END 块中的 复合 语句。

您需要将函数体包含在BEGIN ... END 块中,以允许MySQL 将其视为单个语句;您还也许需要在其前面和后面加上 DELIMITER 语句(取决于您的客户,正如 Berkowski 先生指出的那样):

DELIMITER //

CREATE FUNCTION capitalize(string TEXT)
    RETURNS TEXT
    BEGIN
      DECLARE first_letter TEXT;
      DECLARE last_letters TEXT;
      SET first_letter = UPPER(LEFT(string,1));
      SET last_letters = LOWER(RIGHT(string, LENGTH(string) - 1));
      RETURN CONCAT(first_letter, last_letters);
    END; //

DELIMITER ;

(特别注意最后一个DELIMITER 和分号之间的空格。)

【讨论】:

  • 请注意,指定分隔符的机制是特定于客户端的。官方 MySQL CLI 客户端和 Workbench 使用 DELIMITER 关键字,但其他客户端有不同的实现(输入字段、配置选项等)
  • 我必须相信你的话;我只熟悉两个官方客户。
  • 你确定吗?我将它输入到 sqlfiddle 并得到以下内容。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 'DELIMITER // 附近使用正确的语法
  • @RichardHamilton 查看我的评论。官方 MySQL 客户端(可能是其他客户端)需要 DELIMITER 部分,但 sqlfiddle 不需要它。它不是语言的一部分,而是客户端选项。例如,像 PHPMyAdmin 这样的其他人有一个输入字段来处理它。您使用什么客户端来创建函数?
  • 卫生署!你是对的,理查德。查看我的最新编辑。除此之外,我只是在 mysql (cli) 中对其进行了测试,没有出现错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
相关资源
最近更新 更多