Sql 存储过程/函数能否返回表?
MySql存储过程/函数是否可以在不使用临时表的情况下返回表 创建以下过程Sql 存储过程/函数能否返回表?,sql,mysql,stored-procedures,Sql,Mysql,Stored Procedures,MySql存储过程/函数是否可以在不使用临时表的情况下返回表 创建以下过程 CREATE PROCEDURE database.getExamples() SELECT * FROM examples; 后来又用 CALL database.getExamples() 按预期显示示例表,但似乎无法执行以下操作: SELECT * FROM CALL database.getExamples() 是否可以从存储过程/函数返回查询结果表,如果可以,如何返回?目前,这是不可能的 以下是
CREATE PROCEDURE database.getExamples()
SELECT * FROM examples;
后来又用
CALL database.getExamples()
按预期显示示例表,但似乎无法执行以下操作:
SELECT * FROM CALL database.getExamples()
是否可以从存储过程/函数返回查询结果表,如果可以,如何返回?目前,这是不可能的 以下是关于FROM条款中可能使用的内容的说明:
如您所见,存储过程不在此列表中。您可以通过使用视图而不是存储过程来完成所尝试的操作,但这完全取决于存储过程的功能
如果使用临时表是您唯一的选择,请考虑使用内存存储引擎。
按:
存储过程可以,但存储函数不能看起来这是可以做到的,但是需要使用存储过程中的输出变量。
每个不插入表或变量的SELECT语句将生成一个结果集 如果希望存储过程只返回一个结果集,请确保只有一条SELECT语句。如果有其他SELECT语句,请确保它们将结果插入到表或变量中 更新 下面是存储过程的示例 此存储过程将返回一个结果集:
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 ;
参考:Jakub是正确的。。如果创建的是存储过程而不是函数,它将返回一个结果集。@TomT但是如何使用SELECT使用这样的结果集呢?仍然不允许在中执行程序FROM@Arioch我认为这也是更重要的问题可能需要对链接进行澄清和总结:存储过程可以返回后端调用程序(如JAVA、C等)使用的结果集,每个SELECT语句生成单独的结果集。但是,在本地,这可能是不可能的,即在MySQL Workbench中,您可以在屏幕上看到存储过程的结果作为结果集,但您不能将表返回给存储过程的调用者,除非您为每个返回值使用OUT变量,并将结果重新组合到表行中,这可能被认为是一种灵活和务实的态度,这正是我的想法。你已经发布了答案+1表中没有可能的解决方案吗?因为当你传递一个子查询时,它也会给出一个表引用,所以这可能是真的,这是不可能的,但我认为原因不是你使用的模式postet@Niton我不确定我是否理解你的要求。我是说,你发布的文档没有说明我们不可能使用程序/功能。因为您可以使用一个表引用,我认为它是子查询返回的东西。因此,如果DBMS支持返回表引用的过程,则可以在SELECT中使用它们,即使documentation@Niton是的,的确如此。你知道如何阅读BNF中的语法描述吗?
-- 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
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 ;