Une procédure/fonction stockée MySql peut-elle renvoyer une table sans utiliser de table temporaire?
Création de la procédure suivante
CREATE PROCEDURE database.getExamples()
SELECT * FROM examples;
et l'appeler plus tard avec
CALL database.getExamples()
affiche l'exemple de tableau - comme prévu - mais ce qui suit ne semble pas possible:
SELECT * FROM CALL database.getExamples()
Est-il possible de renvoyer une table de résultats de requête à partir d'une procédure/fonction stockée, et si oui, comment?
Pour l'instant, ce n'est pas possible.
Voici la documentation sur ce qui peut être utilisé dans la clause 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] ...
Comme vous pouvez le voir, les procédures stockées ne figurent pas dans cette liste.
Selon A.4 MySQL 5.6 FAQ: procédures et fonctions stockées :
A.4.14: Les routines stockées MySQL 5.6 peuvent-elles renvoyer des jeux de résultats?
Les procédures stockées le peuvent, mais pas les fonctions stockées.
Il semble que cela puisse être fait, mais en utilisant des variables de sortie de la procédure stockée. 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
Chaque instruction SELECT qui ne s'insère pas dans une table ou une variable produira un jeu de résultats.
Si vous souhaitez que votre procédure stockée renvoie un seul jeu de résultats, assurez-vous que vous n'avez qu'une seule instruction SELECT. Si vous avez d'autres instructions SELECT, assurez-vous qu'elles insèrent des résultats dans une table ou une variable.
MISE À JOUR Voici des exemples de procédures stockées.
Cette procédure stockée renverrait un jeu de résultats:
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 ;
Vous pourrez peut-être faire ce que vous tentez en utilisant une vue au lieu d'une procédure stockée, mais cela dépend entièrement de ce que fait la procédure stockée.
Si l'utilisation d'une table temporaire est votre seule option, envisagez d'utiliser le moteur de stockage MEMORY.