если существует, обновите else insert, с курсорами в хранимых процедурах возвращает только 1 строку - PullRequest
0 голосов
/ 26 октября 2018

У меня есть 2 таблицы api (столбцы - api, api_context, api_id -> первичный ключ) и api_request_summary (столбцы - api_context).Мне нужно вставить количество раз, которое api_context, относящийся к конкретному api_id, повторяется в таблице curhittest1.То есть мне нужно получить количество повторений значения в столбце api_context и вставить его с помощью api_id.Обе таблицы имеют несколько строк, поэтому я использовал курсоры для циклического перемещения по таблицам.я могу правильно вставить значения в таблицу, но мне нужно проверить, существует ли уже этот api_id в таблице curhittest1, и если да, обновить и если нет вставки.

DELIMITER //
CREATE PROCEDURE curhit12()

BEGIN

 DECLARE done INT DEFAULT FALSE;
 DECLARE apiId, noOfHits int(11);
 Declare apiContext varchar(255);

 DECLARE cur1 CURSOR FOR Select api_id from api;

 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;     

  OPEN cur1;

read_loop: LOOP
    FETCH cur1 INTO apiId;

    IF done THEN
      LEAVE read_loop;
    END IF; 

    select api_context into apiContext from api where api_id =apiId;  

    SELECT COUNT(*) FROM api_request_summary WHERE api_context=apiContext into noOfHits;

 IF exists (SELECT * FROM curhittest1 WHERE apiid = apiId) THEN

   UPDATE curhittest1
                      SET noofhits=noOfHits                        
                      WHERE apiid = apiId;
 ELSE

  insert into curhittest1(apiid,noofhits) values (apiId,noOfHits);
 END IF;

  END LOOP;

  CLOSE cur1;

END//
DELIMITER

Когда я использую следующий код только 1 строкадобавлен в таблицу curhittest1.Когда точно такой же код используется в процедурах sql без курсоров, он отображается, поэтому я предполагаю, что мне нужно сделать что-то по-другому при использовании с курсорами.Как я могу точно добавить все значения в таблицу?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Сработало после использования INSERT ... ON DUPLICATE KEY UPDATE.Для всех интересующихся вот код

DELIMITER //
CREATE PROCEDURE curhit12()

BEGIN

 DECLARE done INT DEFAULT FALSE;
 DECLARE apiId, noOfHits int(11);
 Declare apiContext varchar(255);    
 DECLARE cur1 CURSOR FOR Select api_id from api;    
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;     

  OPEN cur1;

read_loop: LOOP
    FETCH cur1 INTO apiId;

    IF done THEN
      LEAVE read_loop;
    END IF; 

    select api_context into apiContext from api where api_id =apiId;  

SET noOfHits = (SELECT COUNT(*) FROM api_request_summary 
                WHERE api_context=apiContext);

INSERT INTO api_hits (api_id,no_of_hits) VALUES (apiId,noOfHits)
   ON DUPLICATE KEY UPDATE no_of_hits=noOfHits;

  END LOOP;

CLOSE cur1;

END//
DELIMITER
0 голосов
/ 27 октября 2018

Второе INTO предложение внутри цикла может вызывать обработчик NOT FOUND.

Изменить эту строку:

SELECT COUNT(*) FROM api_request_summary WHERE api_context=apiContext into noOfHits;

На это:

SET noOfHits = (SELECT COUNT(*) FROM api_request_summary 
                WHERE api_context=apiContext);
...