【问题标题】:MySQL Stored Procedure - increment a variableMySQL存储过程 - 增加一个变量
【发布时间】:2018-03-19 15:23:36
【问题描述】:

为什么我的存储过程在最后两行出错。我错过了什么吗?我正在尝试编写一些东西,它采用我的基础名称并创建一个将其递增 1 并继续直到达到 150 的变量。我知道如何在 Microsft SQL 中执行此操作,这可能是我的语法错误的来源。谢谢。

USE repo;
DELIMITER $$ 
Create DEFINER = 'root' @ 'localhost' procedure csvOutput()

BEGIN DECLARE basis_name int; SET @basis_name = 0;
  if  basis_name < 150 then     
    set basis_name = basis_name + 1;
   SELECT * 
   FROM
    (SELECT 
        'cbt.component',
            'fl.input_flow',
            'ft.flow',
            'Function_ID',
            'sf.subfunction',
            'fl.output_flow',
            'ft2.flow',
            '# of times it appears',
            'sf.tier'
     UNION ALL (SELECT 
        cbt.component,
            fl.input_flow,
            ft.flow,
            sf.id AS 'Function ID',
            sf.subfunction,
            fl.output_flow,
            ft2.flow,
            COUNT(a.name) AS '# of times it appears',
            sf.tier
    FROM
        artifact a, function fu, flow fl, flow_type ft, subfunction_type sf, flow_type ft2, comp_basis_type cbt
    WHERE
        a.id = fu.describes_artifact
            AND fu.id = fl.describes_function
            AND fl.input_flow = ft.id
            AND fl.output_flow = ft2.id
            AND fu.subfunction_type = sf.id
            AND a.basis_name = 115
            AND fu.supporting = 0
            AND a.basis_name = cbt.id
            AND sf.tier >= 3
    GROUP BY fl.input_flow
    ORDER BY COUNT(fu.id) DESC)) resulting_set INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 5.7/Uploads/test4.csv' FIELDS ENCLOSED BY '"' TERMINATED BY ',' ESCAPED BY '"' LINES TERMINATED BY '';

    END$$

    Delimiter;

【问题讨论】:

    标签: mysql database stored-procedures


    【解决方案1】:

    我测试了你的陈述。为了将来参考,当您询问有关 Stack Overflow 的错误时,请包含错误。

    这是我从测试中得到的错误:

    ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 'DECLARE based_name int; 附近使用的正确语法; SET @basis_name = 0;

    我看到了问题,其实就在这一行:

    USE repo; DELIMITER $$ Create DEFINER = 'root' @ 'localhost' procedure csvOutput()
    

    请记住,DELIMITER 将语句分隔符设置为以下文本的所有,直到行尾。所以你设置的分隔符不是$$,而是整个字符串:$$ Create DEFINER = 'root' @ 'localhost' procedure csvOutput()

    该错误报告了DECLARE 的一些问题,因为它正在尝试启动一个新语句,而不是该过程的一部分。 BEGIN TRANSACTION 是一个法律声明,但除此之外,BEGIN 不能在 MySQL 中单独使用。所以BEGIN DECLARE... 导致 MySQL 说:“哇,这不是我希望你在 BEGIN 之后添加的内容!”

    只需在DELIMITER $$ 之后添加一个换行符

    还请注意,您必须在 DELIMITER 语句后使用分号,因为这也将成为语句终止符的一部分。你怎么能把分隔符设置回;


    另一个将来会帮助您的问题,但这不是您询问的错误的根本原因:

    在 MySQL 中,basis_name@basis_name 是两个不同的变量。

    DECLARE within a procedure 声明的变量没有@ 前缀。当您声明它们和使用它们时,您使用它们时不带前缀。这些变量对于声明它们的存储过程是本地的。

    带有@ 前缀的变量不需要声明。这些被称为“user-defined variables”。您可以仅通过为标识符分配值来创建它们。引用这些变量时,必须始终使用 @ 前缀。这些变量不是您设置它们的过程的本地变量。程序完成后,它们在您当前的会话中保留其价值。您可以在过程之外使用简单的 SQL 语句设置它们的值并读取它们的值。

    这是微软用户在迁移到 MySQL 时经常会感到困惑的一个常见问题。

    【讨论】:

    • 所以我按照您的建议做了,但仍然无法正常工作。我已经用新代码更新了问题
    • 很抱歉听到这个消息。不幸的是,“它仍然无法正常工作”不是我熟悉的错误消息。
    猜你喜欢
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 2010-12-18
    • 2014-04-18
    相关资源
    最近更新 更多