【问题标题】:Unable to use declare statement in CREATE FUNCTION无法在 CREATE FUNCTION 中使用声明语句
【发布时间】:2015-05-02 17:28:04
【问题描述】:

我正在尝试在 CREATE FUNCTION 语句中使用 declare [variable] 语句。

我的代码是

/* DELIMITER // */

CREATE FUNCTION hello_world()
  RETURNS TEXT
DECLARE bae int;
BEGIN
  RETURN 'Hello World';
END;
//
/* DELIMITER ; */

代码在没有使用声明的情况下运行良好,但使用声明它给了我错误:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法使用...

如何在函数或存储过程中实际使用 declare 语句?

【问题讨论】:

  • 对于这样的示例,SQL Fiddle 似乎存在问题。我要试试installing mysql locally,我建议你也这样做。
  • sql fiddle 不支持DECLARE
  • 本地安装是可行的方法。 phil 的方法很好,我个人在虚拟框中有一个 linux vm,并使用 sqlyog (webyog.com) 连接到它。 sqlyog 不是免费的,工作台是 (mysql.com/products/workbench)

标签: mysql sqlfiddle


【解决方案1】:

不要注释掉分隔符,声明需要紧跟在begin语句之后:

DELIMITER // 
CREATE FUNCTION hello_world() RETURNS TEXT
BEGIN
DECLARE bae INT;
  RETURN 'Hello World';
END
//
DELIMITER; --restore delimiter

SELECT hello_world() --Hello World

编辑:

我从未使用过 sql fiddle。我已经玩了 5 分钟,我讨厌它:)

显然,sql fiddle 有不同的语法规则。适用于此的是它们不支持分隔符,但确实将 // 内置为“已知分隔符”(Execute triggers stored procedures on SqlFiddle. Mysql)

所以,这行得通:

CREATE function hello_world() returns text
BEGIN
declare bae int;
return "hello world";
END//

select hello_world()

http://sqlfiddle.com/#!2/8e5da4/1

所以,有一个工作小提琴。我手动输入了这个函数,它可以工作。但是,我从字面上将其复制粘贴到一个新的 sqlfiddle 中,然后我得到了

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

所以这种不一致的行为很烦人。

【讨论】:

  • @PhilWalton 它在我第一次复制粘贴时起作用,当我在 varchar 的情况下只使用 int 时它返回错误..似乎 sqlfiddle 有问题
  • 查看更新的答案。我有同样的问题。它只有在我手动输入时才有效,当我复制粘贴时就坏了。 sql fiddle sorta显然很烂....
  • @PhilWalton NP。 sqlfiddle 是一个很棒的概念,但除非解决这样的故障,否则我永远不会使用它
【解决方案2】:

中,在begin-end 块内,每个声明都以declare 开头:

CREATE FUNCTION hello_world()
RETURNS TEXT
BEGIN
    DECLARE bae int;
    RETURN 'Hello World';
END;

【讨论】:

  • 还是同样的错误....如果你能给我提供 sql fiddle 的例子会很有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
  • 1970-01-01
  • 2022-07-07
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
  • 2021-11-28
相关资源
最近更新 更多