【问题标题】:Why is SELECT..PROCEDURE a MySQL syntax error? [closed]为什么 SELECT..PROCEDURE 是 MySQL 语法错误? [关闭]
【发布时间】:2017-01-21 12:19:12
【问题描述】:

我想运行 MySQL 查询,然后处理所有结果集。 MySQL的 5.7 文档说的方法是使用 SELECT ... PROCEDURE 存储过程名称(参数)。我创建了一个存储过程,可以毫无问题地做我想做的事。我在 SELECT ... PROCEDURE 查询中使用它并收到此语法错误:

ComposeStatement(标识符)在此位置无效

(其中 ComposeStatement 是我的存储过程的名称)。我检查了我有正确数量的参数并且它们的类型正确。用一个 不同的程序给出了相同的错误(名称明显改变)。

该文档显示了一个使用名为的过程的语法示例 ANALYZE(我从另一篇文章中了解到现在已弃用,但我真的不关心专门使用 ANALYZE)。当我尝试这个例子时,我得到了同样的错误,使用 ANALYZE 作为标识符。我得到的错误是 不在程序本身中,这就是为什么许多早期的帖子不适用的原因。

有什么建议吗? SELECT..PROCEDURE 结构听起来就像 我需要什么。

【问题讨论】:

标签: mysql select procedure


【解决方案1】:

@LarryGriffith 引用的 MySQL 功能与存储过程无关。

与此弃用功能有关:https://dev.mysql.com/doc/refman/5.7/en/procedure-analyse.html

SELECT col1, col2 FROM table1 PROCEDURE ANALYSE(10, 2000);

PROCEDURE 查询修饰符的这种用法就像在查询的结果集上放置一个过滤函数。它类似于 shell 中的管道:

ls | grep myfile

问题是,您使用的“过程”(示例中为ANALYSE()不是您可以使用CREATE PROCEDURE 编写的类型的存储过程

您必须用 C++ 编写过滤函数并使用 MySQL 源代码编译它。

ANALYZE() 示例最初是作为概念证明或示例,如果开发人员想要开发自己的查询过滤器,可以遵循这些示例。但我从未听说过有人真正创建了自己的查询过滤器。

去年宣布 SELECT ... PROCEDURE ANALYZE() 功能打算在 MySQL 8 中弃用。http://www.tocker.ca/2015/06/29/plan-to-deprecate-procedure-analyse.html

如果您需要对查询结果进行后过滤,编写一个脚本(使用 Python 或任何您喜欢的语言)要容易得多,该脚本从查询结果中获取原始数据,然后执行您需要做的任何事情用它。

【讨论】:

  • 感谢所有回复。 hjpotter 提供了文档的链接;我曾认为(显然是错误的)索引位于
  • 对不起,我不小心按了RETURN并关闭了我之前的评论
  • 必须解除那个 RETUN 键。对此感到抱歉。再次感谢所有回复。 hjpotter 提供了文档的链接;我曾认为(显然是错误的)文档索引找到了我所指的代码。按照比尔卡尔文的评论,似乎
  • 再次抱歉;我只是太习惯于按 RETURN。在@Bill Karwin 的评论之后,文档中的语句似乎是:“PROCEDURE 子句命名了一个应该处理结果集中数据的过程。”应该阅读“一个 PROCEDURE 子句命名一个外部过程..”这将解决我的整个问题。我知道 ANALYZE 的弃用(如我的帖子中所述),但完全不清楚这是否也是 SELECT..PROCEDURE 子句的弃用。文档也需要明确这一点。在我的情况下,Python 等不是一个选择。
  • 太好了,我很高兴你至少得到了答案。仅供参考,您可以编辑您的 cmets(至少几分钟),因此如果您不小心按回车键,您可以完成您的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 2020-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多