【问题标题】:Invalid Script Error using Toad使用 Toad 的无效脚本错误
【发布时间】:2015-10-19 14:45:58
【问题描述】:

我正在尝试为存储过程开发 SQL 语句,该语句将为我提供一些我将使用变量 (@repeated) 指定的计数。

我正在使用 Toad for MySQL,但我不断收到语法错误(描述性不强)。这是我的 SQL:

DECLARE @repeated INT DEFAULT 1;
DECLARE @mailingmonth DATE;

SET @mailingmonth = '2015-10-01';

WHILE @repeated < 12 DO
SELECT A.LoanNumber, Repeated FROM MKT_Mailing_Hist A 
 INNER JOIN (SELECT LoanNumber, COUNT(*) As Repeated
             FROM MKT_Mailing_Hist B
             WHERE MailingMonth <= @mailingmonth
             GROUP BY LoanNumber) AS Months ON A.LoanNumber = Months.LoanNumber
 WHERE A.MailingMonth = @mailingmonth
 AND Repeated = @repeated
 SET @repeated = @repeated + 1;
 END WHILE;
 END;

我认为这种语法可能存在几个问题,但我一直在进行更改,但似乎没有任何效果。

更新

我想将类似的代码封装在带有参数的存储过程中,以便我可以更改参数以满足我的需要。这就是我所拥有的:

DELIMITER $$

CREATE procedure sp_MKT_Counts_Test2 (vRepeated INT, vMailingmonth DATE)
BEGIN

WHILE vRepeated < 12 DO
SELECT COUNT(A.LoanNumber) FROM MKT_Mailing_Hist A 
 INNER JOIN (SELECT LoanNumber, COUNT(*) As Repeated
             FROM MKT_Mailing_Hist B
             WHERE MailingMonth <= vMailingmonth
             GROUP BY LoanNumber) AS Months ON A.LoanNumber = Months.LoanNumber
 WHERE A.MailingMonth = vMailingmonth
 AND Repeated = vRepeated;
 SET vRepeated = vRepeated + 1;
 END WHILE;
  END;
 $$
 DELIMITER ;

但是,当我使用两个参数调用存储过程时,我只收到一条消息,通知我该语句已成功执行,但我没有得到任何结果集。为什么没有结果集?我需要输出参数吗?

【问题讨论】:

  • 如果你在mysql上,你需要写“DO”,在while条件之后:dev.mysql.com/doc/refman/5.0/en/while.html
  • BEGIN 仅适用于存储程序,例如过程或触发器。您是否在过程中工作?
  • Mihai -- 一旦我让它工作,我将把这段代码封装在一个过程中。根据您的建议,我删除了 BEGIN 命令;谢谢你。好的,我也在“WHILE @repeated
  • 现在它将“DECLARE @repeated INT DEFAULT 1”标记为包含语法错误。

标签: mysql variables syntax toad


【解决方案1】:

这将使您摆脱语法错误:

DELIMITER $$
create procedure myProc876()
BEGIN

DECLARE vRepeated INT DEFAULT 1;
DECLARE vMailingmonth DATE;

SET vMailingmonth = '2015-10-01';

WHILE vRepeated < 12 DO
SELECT A.LoanNumber, Repeated FROM MKT_Mailing_Hist A 
 INNER JOIN (SELECT LoanNumber, COUNT(*) As Repeated
             FROM MKT_Mailing_Hist B
             WHERE MailingMonth <= mailingmonth
             GROUP BY LoanNumber) AS Months ON A.LoanNumber = Months.LoanNumber
 WHERE A.MailingMonth = vMailingmonth
 AND Repeated = vRepeated;
 SET vRepeated = vRepeated + 1;
 END WHILE;
 END;
 $$
 DELIMITER ;

它有一个WHILE DO,更改了一些变量名,并用DELIMITER 包裹。定界符很重要,否则找到的第一个分号就结束了。所以 $$ 包裹了整个事情。然后将用户会话分隔符设置回分号。

请注意,您的 AND Repeated = @repeated 最后也没有半号

Delimiters 对于存储过程和创建事件和触发器很重要。

【讨论】:

  • 这非常有效。为什么在子查询中,“mailingmonth”不需要被称为“vMailingmonth”?
  • 说实话,我想把歧义分开。加上一半的时间我不知道要不要用@
猜你喜欢
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 2016-07-06
  • 2017-05-25
  • 1970-01-01
  • 2010-12-29
  • 2015-01-23
  • 1970-01-01
相关资源
最近更新 更多