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