1

この質問は以前にもありましたが、回答がありません。

カーソルを使用して、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
4

2 に答える 2

1

while ループに問題があります。トレースすると、while ループで「ホルダー保険」に対して挿入クエリが起動されないことがわかります。

初めて yy = 0、broker = db_broker および yy = 0 を設定した後。次に、IF yy <> db_year THENTRUE と評価されるため、yy <> 0 をチェックします。これは FALSE と評価されます。次に、yy = db_year を設定するため、yy は 2011 になります。2 回目broker <> db_brokerは FALSE であるため、それ以上のチェックは行わず、3 番目のレコードも同様に進みます。ここで、「Incepta」の 4 番目のレコードが来ると、broker <> db_brokerbroker には「Houlder insurance」があり、db_broker には「Incepta」があるため、TRUE と評価されます。したがって、broker は「Incepta」と yy = 0を保持しyy <> db_year ます。 2012. 次の条件 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 

それがあなたを助けることを願っています...

于 2012-12-06T13:27:13.470 に答える
0

これを試して:

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 DEFAULT 0;
  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;
  curLoop: 
    LOOP 
         FETCH cur1 INTO db_broker, db_year, db_month, db_total;
        IF eof = 1 THEN 
            CLOSE cur1;
            LEAVE curLoop;
        END IF;

    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;

SET eof = 0;        
    END LOOP;

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

END
于 2012-12-06T13:21:11.433 に答える