2009-03-26 635 views
15

Esto es muy similar a la pregunta 653714, pero para MySQL en lugar de SQL Server.MySQL Cómo INSERTAR EN [tabla temporal] FROM [Procedimiento almacenado]

Básicamente, tengo una selección complicada que es la base para varios procedimientos almacenados. Me gustaría compartir el código en los procedimientos almacenados, sin embargo, no estoy seguro de cómo hacerlo. Una forma en que podría hacer esto es hacer que la selección compartida sea un procedimiento almacenado y luego llamar a ese procedimiento almacenado desde los demás. No puedo entender cómo trabajar con el conjunto de resultados del procedimiento almacenado anidado. Si pudiera ponerlos en una tabla temporal podría usar los resultados de manera efectiva, pero no puedo descifrar cómo colocarlos en una tabla temporal. Por ejemplo, esto no funciona:

CREATE TEMPORARY TABLE tmp EXEC nested_sp(); 

Respuesta

13

El problema es que los procedimientos almacenados realmente no devuelven la salida directamente. Pueden ejecutar sentencias selectas dentro del script, pero no tienen valor devuelto.

Llamadas MySQL procedimientos almacenados a través de CALL StoredProcedureName(); Y no puede dirigir esa salida a nada, como no devuelven nada (a diferencia de una función).

MySQL Call Command

+0

Intente usar una subconsulta en línea – bobobobo

+14

Entonces, ¿esta es una respuesta? ¿Dónde está la solución? – Serge

+0

entonces esto no es posible? – Samra

5

Mi primera reacción fue "Eso me parece una visión". ¿No lo resume suficientemente así que puedes agregar la variabilidad en un SP por caso?

Cualquier cosa que agregue una tabla temporal que de lo contrario no estaría allí es un antipatrón muy probable.

4

Sé que esto está llegando muy tarde, pero ya que me tomó años para encontrar una solución real que bien podría compartir. Trabajé en un ejemplo que está abajo.

las tablas creadas son:

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 

a continuación, utilizar estos procedimientos para insertar los valores.

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

LAST_INSERT_ID() toma el último incremento automático de la mesa y lo inserta en la columna de referencia de la tabla secundaria.

En los parámetros de procedimiento _B_ID y _BD_ID representan la B_ID ya que necesito B_ID como una clave externa en ambas tablas.

Lo siento por el exceso de palabras. Todos los otros chicos esperan que usted sepa cómo hacerlo automáticamente. Espero que ayude

3

No puede "SELECCIONAR EN" con los procedimientos almacenados.

Primero cree la tabla temporal y tenga su procedimiento almacenado para almacenar el resultado de la consulta en la tabla temporal creada usando la "INSERT INTO" normal. La tabla temporal es visible siempre que la suelte o hasta que se cierre la conexión.

Cuestiones relacionadas