2009-03-26 16 views
15

Jest to bardzo podobne do pytania 653714, ale do MySQL zamiast do SQL Server.MySQL Jak wstawić do [tabeli tymczasowej] FROM [procedura przechowywana]

Zasadniczo mam skomplikowany wybór, który jest podstawą wielu procedur przechowywanych. Chciałbym udostępnić kod całej procedury przechowywanej, jednak nie jestem pewien, jak to zrobić. Jednym ze sposobów, w jaki mogę to zrobić, jest dokonanie wspólnego wyboru procedury składowanej, a następnie wywołanie tej procedury przechowywanej z innych. Nie mogę dowiedzieć się, jak pracować z zestawem wynikowym zagnieżdżonej procedury przechowywanej. Gdybym mógł umieścić je w tymczasowym stoliku, mogłem efektywnie wykorzystać wyniki, ale nie mogę wymyślić, jak je umieścić w tabeli tymczasowej. Na przykład to nie działa:

CREATE TEMPORARY TABLE tmp EXEC nested_sp(); 

Odpowiedz

13

Problem polega na tym, że procedury przechowywane nie zwracają bezpośrednio danych wyjściowych. Mogą wykonywać instrukcje wyboru wewnątrz skryptu, ale nie mają wartości zwracanej.

MySQL wywołuje procedury składowane za pośrednictwem CALL StoredProcedureName(); I nie można skierować tego wyjścia do niczego, jako nie zwracają niczego (w przeciwieństwie do funkcji).

MySQL Call Command

+0

Spróbuj użyć wbudowanej podkwerendy – bobobobo

+14

To jest odpowiedź? Gdzie jest rozwiązanie? – Serge

+0

, więc nie jest to możliwe? – Samra

5

Moja pierwsza reakcja brzmiała: "To brzmi jak widok dla mnie". Czy to nie wystarczy, żeby można było dodać zmienność do SP w każdym przypadku?

Wszystko, co dodaje tabelę tymczasową, która w przeciwnym razie nie byłaby dostępna, jest bardzo prawdopodobnym antypodstawą.

4

wiem, że to przychodzi bardzo późno, ale ponieważ zajęło mi wieki, aby znaleźć prawdziwe rozwiązanie równie dobrze mogę udostępnić. Pracowałem nad przykładem, który jest poniżej.

tabele utworzone są:

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)); 
  1. 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 

następnie użyć następujących wstawić wartości.

CALL BOOK_IMPORTANT('0.79',LAST_INSERT_ID(),'',LAST_INSERT_ID()); 

LAST_INSERT_ID() zajmuje ostatnie auto przyrost tabeli i wstawia go do kolumny odsyłania w tabeli podrzędnej.

W parametrów zabiegu _B_ID i _BD_ID reprezentują B_ID ponieważ muszę B_ID jako klucz obcy w obu tabelach.

Przepraszamy za nadmiarowe sformułowanie. Wszyscy inni faceci oczekują, że automatycznie wiesz, jak to zrobić. Mam nadzieję, że pomaga

3

Nie można "WYBRAĆ DO" z zapisanymi procedurami.

Najpierw utwórz tabelę tymczasową i zapisz procedurę zapisaną w tabeli tymczasowej za pomocą zwykłego "INSERT INTO". Tabela tymczasowa jest widoczna tak długo, jak ją upuść lub do momentu zamknięcia połączenia.

Powiązane problemy