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));
  • DELIMITER

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". Временная таблица видна до тех пор, пока вы ее уроните или пока соединение не будет закрыто.