Une procédure/fonction stockée peut-elle retourner une table?

est-ce qu'une procédure / fonction MySql stockée peut retourner une table sans l'utilisation de la table de température?

création de la procédure suivante

CREATE PROCEDURE database.getExamples() 
    SELECT * FROM examples;

et plus tard l'appelant avec

CALL database.getExamples()

affiche la table d'exemple - comme prévu - mais la suivante ne semble pas être possible:

SELECT * FROM CALL database.getExamples()

est-il possible de retourner une table de résultat de requête à partir d'une procédure / fonction stockée, et si oui, comment faire?

22
demandé sur marc_s 2009-10-28 16:37:47

5 réponses

pour l'instant, ce n'est pas possible.

Voici la documentation sur ce qui peut être utilisé dans la FROM clause:

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 sont pas dans cette liste.

16
répondu Quassnoi 2009-10-28 13:44:22
9
répondu Jakub Czaplicki 2016-09-23 04:59:46

Vous pourriez être en mesure de faire ce que vous essayez en utilisant une vue au lieu d'une procédure stockée, mais cela dépend entièrement de ce que la procédure stockée.

si l'utilisation d'une table temp est votre seule option, envisagez d'utiliser le moteur de mémoire.

1
répondu Ian Gregory 2009-10-28 13:49:21

il semble que cela peut être fait, mais avec l'utilisation 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
1
répondu atjoedonahue 2015-05-13 13:00:34

chaque instruction SELECT qui ne s'insère pas dans une table ou une variable produira un ensemble de résultats.

si vous voulez que votre procédure stockée ne renvoie qu'un seul jeu de résultats, assurez-vous que vous n'avez qu'une seule instruction SELECT. Si vous avez D'autres énoncés SELECT, assurez-vous qu'ils insèrent des résultats dans un tableau ou une variable.

mise à jour Voici des exemples de procédures stockées.

cette procédure stockée retournerait un résultat jeu:

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 ;

Ref: https://dba.stackexchange.com/questions/8291/how-does-mysql-return-a-result-set-from-a-stored-procedure

1
répondu Harshal 2017-04-13 12:42:36