valor - sintaxis de procedimiento almacenado sql
¿Puede un procedimiento/función almacenado devolver una tabla? (5)
Cada instrucción SELECT que no se inserte en una tabla o una variable producirá un conjunto de resultados.
Si desea que su procedimiento almacenado devuelva solo un conjunto de resultados, asegúrese de tener solo una instrucción SELECT. Si tiene otras declaraciones SELECT, asegúrese de que inserten los resultados en una tabla o variable.
ACTUALIZACIÓN Aquí hay ejemplos de procedimientos almacenados.
Este procedimiento almacenado devolvería un conjunto de resultados:
DELIMITER ;;
CREATE DEFINER=CURRENT_USER PROCEDURE stored_procedure_name()
BEGIN
DECLARE local_variable_name INT;
SELECT column_name FROM table_1 LIMIT 1 INTO local_variable_name;
SELECT * FROM table_1;
END;;
DELIMITER ;
This stored procedure would return two result sets:
DELIMITER ;;
CREATE DEFINER=CURRENT_USER PROCEDURE stored_procedure_name()
BEGIN
DECLARE local_variable_name INT;
SELECT column_name FROM table_1 LIMIT 1 INTO local_variable_name;
SELECT * FROM table_1;
SELECT * FROM table_2;
END;;
DELIMITER ;
¿Puede un procedimiento / función almacenado MySQL devolver una tabla sin el uso de la tabla temporal?
Creando el siguiente procedimiento
CREATE PROCEDURE database.getExamples()
SELECT * FROM examples;
y luego llamándolo con
CALL database.getExamples()
muestra la tabla de ejemplo, tal como se esperaba, pero no parece posible lo siguiente:
SELECT * FROM CALL database.getExamples()
¿Es posible en absoluto devolver una tabla de resultados de la consulta desde un procedimiento / función almacenado, y si es así, cómo?
De acuerdo con A.4 MySQL 5.6 Preguntas frecuentes: Procedimientos almacenados y funciones :
A.4.14: ¿Las rutinas almacenadas de MySQL 5.6 pueden devolver conjuntos de resultados?
Los procedimientos almacenados pueden, pero las funciones almacenadas no pueden.
En cuanto a ahora, esto no es posible.
Aquí está la documentation sobre lo que se puede usar en la cláusula FROM
:
table_references:
table_reference [, table_reference] ...
table_reference:
table_factor
| join_table
table_factor:
tbl_name [[AS] alias] [index_hint)]
| table_subquery [AS] alias
| ( table_references )
| { OJ table_reference LEFT OUTER JOIN table_reference
ON conditional_expr }
join_table:
table_reference [INNER | CROSS] JOIN table_factor [join_condition]
| table_reference STRAIGHT_JOIN table_factor
| table_reference STRAIGHT_JOIN table_factor ON conditional_expr
| table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_condition
| table_reference NATURAL [{LEFT|RIGHT} [OUTER]] JOIN table_factor
join_condition:
ON conditional_expr
| USING (column_list)
index_hint:
USE {INDEX|KEY} [FOR JOIN] (index_list)
| IGNORE {INDEX|KEY} [FOR JOIN] (index_list)
| FORCE {INDEX|KEY} [FOR JOIN] (index_list)
index_list:
index_name [, index_name] ...
Como puede ver, los procedimientos almacenados no están en esta lista.
Es posible que pueda hacer lo que está intentando utilizando una vista en lugar de un procedimiento almacenado, pero eso depende completamente de lo que haga el procedimiento almacenado.
Si su única opción es usar una tabla temporal, considere usar el motor de almacenamiento MEMORY.
Parece que se puede hacer, pero con el uso de variables de salida del procedimiento almacenado. http://www.sqlinfo.net/mysql/mysql_stored_procedure_SELECT.php
-- 1. Create Procedure
DROP PROCEDURE IF EXISTS `sp_students_SELECT_byPK`
GO
CREATE PROCEDURE sp_students_SELECT_byPK
(
IN p_student_id INT(11) ,
OUT p_password VARCHAR(15) ,
OUT p_active_flg TINYINT(4) ,
OUT p_lastname VARCHAR(30) ,
OUT p_firstname VARCHAR(20) ,
OUT p_gender_code VARCHAR(1) ,
OUT p_birth_dttm DATETIME
)
BEGIN
SELECT password ,
active_flg ,
lastname ,
firstname ,
gender_code ,
birth_dttm
INTO p_password ,
p_active_flg ,
p_lastname ,
p_firstname ,
p_gender_code ,
p_birth_dttm
FROM students
WHERE student_id = p_student_id ;
END
GO
-- 2. Select Results from Stored Procedure
/***
IN p_student_id INT(11)
OUT p_password VARCHAR(15)
OUT p_active_flg TINYINT(4)
OUT p_lastname VARCHAR(30)
OUT p_firstname VARCHAR(20)
OUT p_gender_code VARCHAR(1)
OUT p_birth_dttm DATETIME
***/
CALL sp_students_SELECT_byPK
(
8,
@p_password ,
@p_active_flg ,
@p_lastname ,
@p_firstname ,
@p_gender_code ,
@p_birth_dttm
)
GO
SELECT @p_password AS p_password ,
@p_active_flg AS p_active_flg ,
@p_lastname AS p_lastname ,
@p_firstname AS p_firstname ,
@p_gender_code AS p_gender_code ,
@p_birth_dttm AS p_birth_dttm
GO