MySQL Как вставить INTO [temp table] FROM [Сохраненная процедура]
Это очень похоже на вопрос 653714, но для MySQL вместо SQL Server.
В принципе, у меня сложный выбор, который является основой для нескольких хранимых процедур. Я хотел бы поделиться кодом через хранимые процедуры, однако я не уверен, как это сделать. Один из способов сделать это - сделать общий выбор хранимой процедуры, а затем вызвать эту хранимую процедуру из других. Я не могу понять, как работать с набором результатов вложенной хранимой процедуры. Если бы я мог помещать их в временную таблицу, я мог бы эффективно использовать результаты, но я не могу понять, как их получить в таблице temp. Например, это не работает:
CREATE TEMPORARY TABLE tmp EXEC nested_sp();
Ответы
Ответ 1
Проблема заключается в том, что хранимые процедуры не возвращают результат напрямую. Они могут выполнять команды выбора внутри script, но не имеют возвращаемого значения.
MySQL вызывает хранимые процедуры через CALL StoredProcedureName();
И вы не можете направить этот вывод на что-либо, поскольку они ничего не возвращают (в отличие от функции).
MySQL Call Command
Ответ 2
Моя первая реакция: "Это похоже на меня". Разве это недостаточно абстрактно, поэтому вы можете просто добавить изменчивость в SP для каждого случая?
Все, что добавляет временную таблицу, которая в противном случае не была бы там, представляет собой очень вероятный антипаттерн.
Ответ 3
Я знаю, что это происходит очень поздно, но так как потребовалось много времени, чтобы найти реальное решение, которое я мог бы также поделиться. Я работал над примером, который ниже.
создаются следующие таблицы:
CREATE TABLE BOOK(
B_ID INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(B_ID),
TITLE VARCHAR(100),
DESCRIPTION VARCHAR(30),
PRICE DOUBLE);
CREATE TABLE BOOK_COMMENT(
PRIMARY KEY(B_C_ID),
B_C_ID INT NOT NULL AUTO_INCREMENT,
REMARK VARCHAR(120),
B_ID INT,
FOREIGN KEY(B_ID) REFERENCES BOOK(B_ID));
CREATE TABLE AUTHOR(
A_ID INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(A_ID),
A_NAME CHAR(15),
B_ID INT,
FOREIGN KEY(B_ID) REFERENCES BOOK(B_ID));
CREATE PROCEDURE BOOK_IMPORTANT( _PRICE DOUBLE, _B_ID INT, A_NAME CHAR(15), _BD_ID INT)
BEGIN
INSERT INTO BOOK(PRICE)
VALUES(_PRICE);
SET _B_ID=LAST_INSERT_ID();
INSERT INTO BOOK_COMMENT(B_ID)
VALUES(_B_ID);
SET _BD_ID=LAST_INSERT_ID();
INSERT INTO AUTHOR(A_NAME,B_ID)
VALUES(A_NAME,_BD_ID);
END
затем используйте следующее, чтобы вставить значения.
CALL BOOK_IMPORTANT('0.79',LAST_INSERT_ID(),'',LAST_INSERT_ID());
LAST_INSERT_ID()
принимает последний автоматический приращение таблицы и вставляет ее в столбец ссылок дочерней таблицы.
В параметрах процедуры _B_ID
и _BD_ID
представлены B_ID
, так как мне нужно B_ID
в качестве внешнего ключа в обеих таблицах.
Извините за излишнюю формулировку. Все остальные ребята ожидают, что вы автоматически узнаете, как это сделать. Надеюсь, что это поможет.
Ответ 4
Вы не можете "SELECT INTO" с хранимыми процедурами.
Сначала создайте временную таблицу и сохраните хранимую процедуру для хранения результата запроса в созданной временной таблице, используя обычный "INSERT INTO". Временная таблица видна до тех пор, пока вы ее уроните или пока соединение не будет закрыто.