gpt4 book ai didi

MySQL - 游标在存储过程中不起作用

转载 作者:行者123 更新时间:2023-11-29 00:37:05 25 4
gpt4 key购买 nike

我看到之前有人问过这个问题,但没有提供答案。

我正在使用游标来解析 SELECT 语句返回的数据。但是,与在命令行中运行 SELECT 语句相比,它不会返回我期望的数据。

Broker                  Year    Month   Total
Houlder Insurance 2011 10 1
Houlder Insurance 2011 11 1
Houlder Insurance 2011 12 1
Incepta 2012 6 4
Incepta 2012 7 6
Incepta 2012 8 4
Kay International Plc 2011 10 4
Kay International Plc 2011 11 5
Kay International Plc 2011 12 2
Kay International Plc 2012 1 1
Kay International Plc 2012 2 1
Kay International Plc 2012 4 4
Kay International Plc 2012 5 6
Kay International Plc 2012 6 2
Kay International Plc 2012 7 1
Kay International Plc 2012 8 1
Miles Smith 2011 12 3
Miles Smith 2012 2 1
Miles Smith 2012 4 1
Miles Smith 2012 5 6
Miles Smith 2012 6 1
Miles Smith 2012 7 2
Miles Smith 2012 8 2

当我运行下面的存储过程代码时,似乎只返回与经纪人“Kay International”和“Incepta”有关的记录!这个问题有解决办法吗?

    CREATE DEFINER = 'root'@'localhost'
PROCEDURE src_survey.PopulateReportMonthSurveySubmitted()
BEGIN DECLARE broker TEXT;
DECLARE yy INT;
DECLARE jan INT;
DECLARE feb INT;
DECLARE mar INT;
DECLARE apr INT;
DECLARE may INT;
DECLARE jun INT;
DECLARE jul INT;
DECLARE aug INT;
DECLARE sep INT;
DECLARE toct INT;
DECLARE nov INT;
DECLARE tdec INT;

DECLARE db_broker TEXT;
DECLARE db_year INT;
DECLARE db_month INT;
DECLARE db_total INT;

DECLARE eof INT;
DECLARE cur1 CURSOR FOR SELECT b.company_name AS 'Broker'
, year(submit_date_time) AS 'Year'
, month(submit_date_time) AS 'Month'
, count(*) AS 'Total'
FROM
survey_request a
JOIN survey d
ON d.src_reference = a.src_reference
JOIN contacts_companies b
ON b.reference = a.broker_company_reference
JOIN src_status c
ON c.reference = a.src_status_reference
WHERE
underwriter_company_reference = 73
GROUP BY
broker
, year
, month
ORDER BY
broker
, year
, month;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET eof = 1;

SET broker = '';
SET yy = 0;
SET jan = 0;
SET feb = 0;
SET mar = 0;
SET apr = 0;
SET may = 0;
SET jun = 0;
SET jul = 0;
SET aug = 0;
SET sep = 0;
SET toct = 0;
SET nov = 0;
SET tdec = 0;

TRUNCATE TABLE reportmonthsurveysubmitted;
OPEN cur1;
SET eof = 0;

WHILE eof = 0
DO
FETCH cur1 INTO db_broker, db_year, db_month, db_total;
IF broker <> db_broker THEN
SET broker = db_broker;
SET yy = 0;
END IF;
IF yy <> db_year THEN
IF yy <> 0 THEN
INSERT INTO reportmonthsurveysubmitted VALUES (0, broker, yy, jan, feb, mar, apr, may, jun, jul, aug, sep, toct, nov, tdec);
END IF;
SET yy = db_year;
SET jan = 0;
SET feb = 0;
SET mar = 0;
SET apr = 0;
SET may = 0;
SET jun = 0;
SET jul = 0;
SET aug = 0;
SET sep = 0;
SET toct = 0;
SET nov = 0;
SET tdec = 0;
END IF;
CASE db_month
WHEN 1 THEN
SET jan = db_total;
WHEN 2 THEN
SET feb = db_total;
WHEN 3 THEN
SET mar = db_total;
WHEN 4 THEN
SET apr = db_total;
WHEN 5 THEN
SET may = db_total;
WHEN 6 THEN
SET jun = db_total;
WHEN 7 THEN
SET jul = db_total;
WHEN 8 THEN
SET aug = db_total;
WHEN 9 THEN
SET sep = db_total;
WHEN 10 THEN
SET toct = db_total;
WHEN 11 THEN
SET nov = db_total;
WHEN 12 THEN
SET tdec = db_total;
END CASE;

END WHILE;
CLOSE cur1;

INSERT INTO reportmonthsurveysubmitted VALUES (0, broker, yy, jan, feb, mar, apr, may, jun, jul, aug, sep, toct, nov, tdec);

END

最佳答案

您的 while 循环有问题。如果您将跟踪,那么您将了解到在 while 循环中没有为“Houlder insurance”触发插入查询。

第一次 yy = 0,在设置 broker = db_broker 和 yy = 0 之后。然后,IF yy <> db_year THEN评估为 TRUE,因此它将检查 yy <> 0,它是,因此评估为 FALSE。然后它设置 yy = db_year,因此 yy 变为 2011。第二次,broker <> db_broker是假的,所以它不会去进一步检查,然后第三条记录也去。现在,当第四条记录出现在“Incepta”时,broker <> db_broker计算结果为 TRUE,因为经纪人有“Houlder insurance”并且 db_broker 有“Incepta”,所以经纪人持有“Incepta”并且 yy = 0。接下来,yy <> db_year yy = 0 且 db_year 为 2012 时计算为 TRUE。下一个条件 yy <> 0 为 FALSE,因此这次也未执行插入,因此它作为一个整体完全跳过了“Houlder insurance”记录。

修改后的步骤如下

 CREATE DEFINER = 'root'@'localhost'
PROCEDURE src_survey.PopulateReportMonthSurveySubmitted()
BEGIN DECLARE broker TEXT;
DECLARE yy INT;
DECLARE jan INT;
DECLARE feb INT;
DECLARE mar INT;
DECLARE apr INT;
DECLARE may INT;
DECLARE jun INT;
DECLARE jul INT;
DECLARE aug INT;
DECLARE sep INT;
DECLARE toct INT;
DECLARE nov INT;
DECLARE tdec INT;

DECLARE db_broker TEXT;
DECLARE db_year INT;
DECLARE db_month INT;
DECLARE db_total INT;

DECLARE eof INT;
DECLARE cur1 CURSOR FOR SELECT b.company_name AS 'Broker'
, YEAR(submit_date_time) AS 'Year'
, MONTH(submit_date_time) AS 'Month'
, COUNT(*) AS 'Total'
FROM
survey_request a
JOIN survey d
ON d.src_reference = a.src_reference
JOIN contacts_companies b
ON b.reference = a.broker_company_reference
JOIN src_status c
ON c.reference = a.src_status_reference
WHERE
underwriter_company_reference = 73
GROUP BY
broker
, YEAR
, MONTH
ORDER BY
broker
, YEAR
, MONTH;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET eof = 1;

SET broker = '';
SET yy = 0;
SET jan = 0;
SET feb = 0;
SET mar = 0;
SET apr = 0;
SET may = 0;
SET jun = 0;
SET jul = 0;
SET aug = 0;
SET sep = 0;
SET toct = 0;
SET nov = 0;
SET tdec = 0;

TRUNCATE TABLE reportmonthsurveysubmitted;
OPEN cur1;
SET eof = 0;

WHILE eof = 0
DO
FETCH cur1 INTO db_broker, db_year, db_month, db_total;
IF broker <> db_broker THEN
IF yy <> 0 THEN
INSERT INTO reportmonthsurveysubmitted VALUES (0, broker, yy, jan, feb, mar, apr, may, jun, jul, aug, sep, toct, nov, tdec);
END IF;
SET broker = db_broker;
SET yy = 0;
END IF;
IF yy <> db_year THEN
IF yy <> 0 THEN
INSERT INTO reportmonthsurveysubmitted VALUES (0, broker, yy, jan, feb, mar, apr, may, jun, jul, aug, sep, toct, nov, tdec);
END IF;

SET yy = db_year;
SET jan = 0;
SET feb = 0;
SET mar = 0;
SET apr = 0;
SET may = 0;
SET jun = 0;
SET jul = 0;
SET aug = 0;
SET sep = 0;
SET toct = 0;
SET nov = 0;
SET tdec = 0;
END IF;

CASE db_month
WHEN 1 THEN
SET jan = db_total;
WHEN 2 THEN
SET feb = db_total;
WHEN 3 THEN
SET mar = db_total;
WHEN 4 THEN
SET apr = db_total;
WHEN 5 THEN
SET may = db_total;
WHEN 6 THEN
SET jun = db_total;
WHEN 7 THEN
SET jul = db_total;
WHEN 8 THEN
SET aug = db_total;
WHEN 9 THEN
SET sep = db_total;
WHEN 10 THEN
SET toct = db_total;
WHEN 11 THEN
SET nov = db_total;
WHEN 12 THEN
SET tdec = db_total;
END CASE;

END WHILE;
CLOSE cur1;

INSERT INTO reportmonthsurveysubmitted VALUES (0, broker, yy, jan, feb, mar, apr, may, jun, jul, aug, sep, toct, nov, tdec);

END

希望对你有帮助...

关于MySQL - 游标在存储过程中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13744192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com