Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 存储过程/函数能否返回表?_Sql_Mysql_Stored Procedures - Fatal编程技术网

Sql 存储过程/函数能否返回表?

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() 是否可以从存储过程/函数返回查询结果表,如果可以,如何返回?目前,这是不可能的 以下是

MySql存储过程/函数是否可以在不使用临时表的情况下返回表

创建以下过程

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 ;