Как создать процедуру для вставки, которая возвращает вставленную строку - PullRequest
0 голосов
/ 04 ноября 2018

Вот мой текущий SQL:

CREATE PROCEDURE addBlog(@title VARCHAR(255), @body VARCHAR(255), OUT @uuid INT) BEGIN
    INSERT INTO blogs b (b.title, b.detail) VALUES (@title, @body);
    SELECT LAST_INSERT_ID() INTO @uuid;
    SELECT @uuid;
END

Который выдает эту ошибку (напрямую из экспорта SQL):

1064 - у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, чтобы найти правильный синтаксис для использования рядом с @title VARCHAR (255), @body VARCHAR (255), OUT @uuid INT) НАЧАЛО INSERT INTO blog 'в строке 1

В моей базе данных есть AUTO_INCREMENT PRIMARY KEY на uuid INT (255), который я хочу вернуть с помощью этой процедуры. Любая помощь будет великолепна.

Мой стол выглядит так:

CREATE TABLE `blogs` (
  `uuid` int(255) NOT NULL,
  `title` varchar(1024) NOT NULL,
  `detail` varchar(1024) NOT NULL,
  `user_id` int(255) NOT NULL,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `blogs`
  ADD PRIMARY KEY (`uuid`),
  ADD KEY `user_id` (`user_id`);

ALTER TABLE `blogs`
  MODIFY `uuid` int(255) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;

ALTER TABLE `blogs`
  ADD CONSTRAINT `blogs_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` 
(`uuid`) ON DELETE NO ACTION ON UPDATE NO ACTION;

ОБНОВЛЕННЫЙ SQL:

CREATE PROCEDURE addBlog(
    IN in_title VARCHAR(255),
    IN in_body VARCHAR(255), 
    IN in_user INT(255),
    OUT out_uuid INT
) BEGIN
    INSERT INTO `blogs` (`title`, `detail`, `user_id`) VALUES (in_title, in_body, in_user);
    SELECT LAST_INSERT_ID() INTO out_uuid;
    SELECT out_uuid;
END;

Ответы [ 2 ]

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

Вам не хватает определения типа параметра, такого как IN, OUT и т. Д. Кроме того, я не думаю, что вам нужно использовать @ в определении параметра.

Кроме того, я хотел бы убедиться, что имена переменных / параметров в хранимой процедуре / триггере и т. Д. Отличаются от любых имен таблиц / столбцов, используемых в них.

Кроме того, если вы еще этого не сделали, вам необходимо переопределить разделитель на что-то другое (например, $$), отличное от ;; и переопределить его обратно к ; в конце.

DELIMITER $$ -- define the delimiter

CREATE PROCEDURE addBlog(IN title_in VARCHAR(255), -- added suffix "in" to param name
                         IN body_in VARCHAR(255), 
                         OUT uuid_out INT) BEGIN
...... 

END $$ -- end of stored procedure
DELIMITER ; -- redefine delimiter back to ;
0 голосов
/ 04 ноября 2018

Ваш синтаксис - странная смесь из нескольких баз данных. Я думаю, что вы хотите:

CREATE PROCEDURE addBlog (
    in_title VARCHAR(255),
    in_body VARCHAR(255),
    OUT out_uuid INT
)
BEGIN
    INSERT INTO blogs (title, detail)
        VALUES (in_title, in_body);
    SELECT LAST_INSERT_ID() INTO out_uuid;
    -- SELECT out_uuid;
END;

Здесь - это дБ <> скрипка.

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