Solución:
El problema es que los procedimientos almacenados no devuelven resultados directamente. Pueden ejecutar sentencias de selección dentro del script, pero no tienen valor de retorno.
MySQL llama a procedimientos almacenados a través de CALL StoredProcedureName();
Y no puede dirigir esa salida a nada, ya que no devuelven nada (a diferencia de una función).
Comando de llamada de MySQL
Mi primera reacción fue “Eso me suena a vista”. ¿No lo abstrae lo suficiente como para que pueda agregar la variabilidad en un SP por caso?
Cualquier cosa que agregue una tabla temporal que de otra manera no estaría allí es un antipatrón muy probable.
Sé que esto llegará muy tarde, pero como me tomó años encontrar una solución real, también podría compartirla. Trabajé en un ejemplo que está a continuación.
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));
- 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
luego use lo siguiente 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 tabla y lo inserta en la columna de referencia de la tabla secundaria.
En los parámetros del procedimiento _B_ID
y _BD_ID
representar el B_ID
ya que necesito B_ID
como clave externa en ambas tablas.
Perdón por el exceso de redacción. Todos los demás chicos esperan que sepas automáticamente cómo hacerlo. Espero eso ayude