Может ли хранимая процедура/функция возвращать таблицу?
Может ли хранимая процедура/функция MySql возвращать таблицу без использования таблицы temp?
Создание следующей процедуры
CREATE PROCEDURE database.getExamples()
SELECT * FROM examples;
а затем называя его
CALL database.getExamples()
отображает примерную таблицу - как и ожидалось - но следующее не представляется возможным:
SELECT * FROM CALL database.getExamples()
Возможно ли вообще вернуть таблицу результатов запроса из хранимой процедуры/функции, а если так - как?
Ответы
Ответ 1
Пока что это невозможно.
Вот документация о том, что может использоваться в предложении 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] ...
Как вы можете видеть, хранимые процедуры в этом списке отсутствуют.
Ответ 2
Согласно A.4 MySQL 5.6 FAQ: Хранимые процедуры и функции:
Сохраненные процедуры могут, но сохраненные функции не могут.
Ответ 3
Возможно, вы сможете делать то, что вы пытаетесь, используя представление вместо хранимой процедуры, но это полностью зависит от того, что делает хранимая процедура.
Если использовать временную таблицу - ваш единственный вариант, подумайте об использовании механизма хранения MEMORY.
Ответ 4
Похоже, что это можно сделать, но с использованием выходных переменных из хранимой процедуры.
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
Ответ 5
Каждый оператор SELECT, который не вставляется в таблицу или переменную, создает набор результатов.
Если вы хотите, чтобы ваша хранимая процедура возвращала только один набор результатов, убедитесь, что у вас есть только одна инструкция SELECT. Если у вас есть другие операторы SELECT, убедитесь, что они вставляют результаты в таблицу или переменную.
UPDATE
Вот примеры хранимых процедур.
Эта хранимая процедура вернет один результирующий набор:
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 ;
Ссылка: https://dba.stackexchange.com/info/8291/how-does-mysql-return-a-result-set-from-a-stored-procedure