MySQL存储过程 - 增加变量

时间:2018-03-19 15:23:37

标签: mysql database stored-procedures

为什么我的存储过程在最后两行出错。我错过了什么吗?我正在尝试编写一些带有我的基础名称的东西,并创建一个变量,将其递增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;

1 个答案:

答案 0 :(得分:0)

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

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

  

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

我看到了问题,实际上是在这一行:

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

请记住DELIMITER将语句分隔符设置为以下文本的 all ,直到行结束。因此,您已将分隔符设置为$$,而不是整个字符串:$$ 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语句设置其值并读取其值。

这是Microsoft用户在迁移到MySQL时感到困惑的常见问题。