使用 Toad 时出现无效的脚本错误
Invalid Script Error using Toad
我正在尝试为存储过程开发 SQL 语句,它将为我提供我将使用变量 (@repeated) 指定的计数。
我正在为 MySQL 使用 Toad,但我不断收到语法错误(描述性不强)。这是我的 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 ;
但是,当我用这两个参数调用存储过程时,我只是得到一条消息,通知我语句执行成功,但我没有得到结果集。为什么没有结果集?我需要输出参数吗?
这将使您克服语法错误:
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 对于存储过程以及创建事件和触发器很重要。
我正在尝试为存储过程开发 SQL 语句,它将为我提供我将使用变量 (@repeated) 指定的计数。
我正在为 MySQL 使用 Toad,但我不断收到语法错误(描述性不强)。这是我的 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 ;
但是,当我用这两个参数调用存储过程时,我只是得到一条消息,通知我语句执行成功,但我没有得到结果集。为什么没有结果集?我需要输出参数吗?
这将使您克服语法错误:
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 对于存储过程以及创建事件和触发器很重要。