Mysql 5.7 Проблема в объявлении обработчика для дубликата ключа - PullRequest
0 голосов
/ 20 мая 2019

Мы столкнулись с проблемой при объявлении обработчиков в хранимой процедуре MYSQL 5.7. Используя документацию, представленную в https://dev.mysql.com/doc/refman/5.7/en/get-diagnostics.html, Я пытаюсь создать обработчик в моей хранимой процедуре для выполнения следующих действий:

  1. Если появляется повторяющийся ключ, зарегистрируйте его и перейдите к строке вставки.
  2. Конец сохраненного процесса, вставьте мне все строки ошибок и успехов.

Как вы можете видеть ниже, у нас нет первичного ключа для таблицы, но есть ограничение уникального ключа.

Input

CALL userTableInsert('{"userid":100, "username":"Hello"}, {"userid":102, "username":"World"}, {"userid":102, "username":"World"}', @got_dups)

Ожидаемый результат

100:Hello should get inserted and 102:World should get errored out and status needs to be corrected depicted in the output of the stored procedure.

Получение ERR : Код ошибки: 1064. У вас ошибка в синтаксисе SQL; обратитесь к руководству, соответствующему вашей версии сервера MySQL, чтобы узнать правильный синтаксис для использования рядом с 'DECLARE CONTINUE HANDLER FOR SQLEXCEPTION ...' *

Table: user_table
CREATE TABLE `user_table` (
  user_id int(20) NOT NULL,
  user_name varchar(255) DEFAULT NULL,
  created_by varchar(255) NOT NULL,
  created_date date NOT NULL,
  UNIQUE KEY `user_ukey` (user_id, user_name)
) ENGINE=InnoDB DEFAULT CHARSET=latin1


 ===============================================
 Stored Procedure
 ===============================================



DELIMITER $$
DROP PROCEDURE IF EXISTS schema.userTableInsert$$
CREATE PROCEDURE schema.userTableInsert(IN JSONArrayParam MEDIUMTEXT, OUT 
got_dups INT)
SQL SECURITY INVOKER
BEGIN

DECLARE code CHAR(5) DEFAULT '00000';
DECLARE msg TEXT;
DECLARE rows INT;
DECLARE result TEXT;

DECLARE rowsJSON MEDIUMTEXT DEFAULT NULL;
SET rowsJSON = TRIM(JSONArrayParam);
SET rowsJSON = TRIM(LEADING '[' FROM rowsJSON);
SET rowsJSON = TRIM(TRAILING ']' FROM rowsJSON);

DROP TEMPORARY TABLE IF EXISTS rowsToUse;
CREATE TEMPORARY TABLE rowsToUse (
     user_id INT NOT NULL,
     user_name VARCHAR(255) DEFAULT NULL
) ENGINE=MEMORY;


WHILE (rowsJSON != '') DO
    BEGIN
        DECLARE rowJSON VARCHAR(4096) DEFAULT NULL;
        DECLARE temp JSON;
        DECLARE userid INT DEFAULT NULL;
        DECLARE username VARCHAR(255) DEFAULT NULL;

        SET rowJSON = CONCAT(SUBSTRING_INDEX(rowsJSON, '}', 1), '}');

        SET temp = JSON_EXTRACT(rowJSON, '$.userid');
        SET userid = COALESCE(IF(JSON_TYPE(temp) = 'NULL', NULL, REPLACE(temp, '\"', '')));

        SET temp = JSON_EXTRACT(rowJSON, '$.username');
        SET username = COALESCE(IF(JSON_TYPE(temp) = 'NULL', NULL, REPLACE(temp, '\"', '')));

        INSERT INTO rowsToUse(user_id, user_name)
        VALUES(userid, username);

        IF LOCATE('{', rowsJSON, 2) > 0 THEN
            SET rowsJSON = SUBSTRING(rowsJSON, LOCATE('{', rowsJSON, 2));
        ELSE
            SET rowsJSON = '';
        END IF;        
    END;
END WHILE;

SET SQL_SAFE_UPDATES=0;

 # Getting syntax error here
 DECLARE CONTINUE HANDLER FOR 1062
  BEGIN
  GET DIAGNOSTICS CONDITION 1
    code = RETURNED_SQLSTATE, msg = MESSAGE_TEXT;
  END;

 INSERT INTO user_table(user_id, user_name, created_by , created_date)
 SELECT user_id, user_name, 'system', NOW()
 FROM rowsToUse;


IF code = '00000' THEN
    GET DIAGNOSTICS rows = ROW_COUNT;
    SET result = CONCAT('insert succeeded, row count = ',rows);
ELSE
    SET result = CONCAT('insert failed, error = ',code,', message = ',msg);
END IF;


DROP TEMPORARY TABLE IF EXISTS rowsToUse;

SET SQL_SAFE_UPDATES=1;

SELECT result;

END
$$
DELIMITER ;

==============================================================

Пожалуйста, помогите мне в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...