Mysql 如何从对存储过程的内部调用中获取记录集?

Mysql 如何从对存储过程的内部调用中获取记录集?,mysql,stored-procedures,mariadb,Mysql,Stored Procedures,Mariadb,我有一个存储过程,我想在内部调用另一个返回记录集的过程,如何通过“调用”获得一个导航存储过程返回的记录集的命令 [编辑]我一直在尝试按照建议使用临时表,但遇到问题: DROP TEMPORARY TABLE IF EXISTS tbl_HeadOfDepts; CREATE TEMPORARY TABLE tbl_HeadOfDepts (biDept_id tinyint(4)) INSERT INTO tbl_HeadOfDepts CALL rsHeadOfAnyD

我有一个存储过程,我想在内部调用另一个返回记录集的过程,如何通过“调用”获得一个导航存储过程返回的记录集的命令

[编辑]我一直在尝试按照建议使用临时表,但遇到问题:

    DROP TEMPORARY TABLE IF EXISTS tbl_HeadOfDepts;
    CREATE TEMPORARY TABLE tbl_HeadOfDepts (biDept_id tinyint(4))
    INSERT INTO tbl_HeadOfDepts CALL rsHeadOfAnyDepartments(vcCompKey, biWho_id);
我需要使用CALL,因为'rsHeadofAnydPartments'不是函数,但这将不被接受

工作正在进行中,但到目前为止,我所拥有的内容未被编辑接受:

    BEGIN
    #--
    # Procedure:
    #   rsWhoCanIaccess
    #
    # Parameters:
    #   vcCompKey, the key corresponding to the company
    #   biWho_id, the id of the person to check access for
    #
    # Returns:
    #   recordset containing all the people this person can access
    #--
        DECLARE tiSuperUser tinyint(4); 
        DECLARE EXIT HANDLER FOR SQLEXCEPTION
            BEGIN
                GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, 
                @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT;
                CALL procLogError(vcCompKey, CONCAT("rsWhoCanIaccess: "
                                        ,@errno, " (", @sqlstate, "): ", @text));
            END;        
    #Is this user a super user?
        SELECT tiIsSuperUser(vcCompKey, biWho_id) INTO tiSuperUser;
        SET tiSuperUser = 0;#Hack for testing
        IF (tiSuperUser = 1) THEN
    #The user is a superuser, return everyone in the company
            SELECT 
                t1.biPerson_id 
            FROM 
                tbl_people t1
            INNER JOIN
                tbl_companies t2
            ON
                t1.biCompany_id=t2.biCompany_id
            AND
                t2.vcKey=vcCompKey;         
        ELSE            
    #User is not a superuser, is the user head of any departments?
            DROP TEMPORARY TABLE IF EXISTS tbl_HeadOfDepts;
            CREATE TEMPORARY TABLE tbl_HeadOfDepts (biDept_id tinyint(4))
            INSERT INTO tbl_HeadOfDepts CALL rsHeadOfAnyDepartments(vcCompKey, biWho_id);

            SELECT * FROM tbl_HeadOfDepts;
        END IF;
    END
我想在内部调用另一个返回记录集的过程

在您的内部过程中,创建一个
临时表
,并填充该临时表,说明
插入到您的临时表选择查询中
。然后,您可以在任何地方的外部查询中使用相同的临时表

它甚至可以是一个普通表,而不必是临时表。还应确保在程序计算完成后,作为清理,将表放入

根据你的评论,这是错误的。您应该像下面这样做(示例代码)


不可以,存储过程可以生成结果集,但不能将其作为内部调用到其他存储过程的输出直接使用。在性能方面,最好是填充一个非临时工作表并使用结果

根据您的软件和并发多个调用者的实际情况,您可能需要在某些控制表中包含一个会话id概念和一个自动增量(
AI
)列。这将确保在并发情况下,多个调用者不会互相踩踏对方的行,从而使其不可行

该会议将如何在高级别上开展工作,如下所示。内部存储过程将从控制表中获得一个
AI
值(
session
),使用它在工作表中填充一个安全分段的会话,并作为
out
参数返回外部(调用)存储过程。然后,外部用户可以安全地使用这些行,并在末尾进行清理(
delete from workTable,其中sessionId=theSession


为什么我建议使用非临时工作台?明确地说,工作台将是非临时的。首先,让
if exists下拉菜单
工作是件麻烦事。不过,最重要的是,这与性能有关。用于临时表创建的DDL调用并不便宜。只有在进行性能测试以了解我的意思时,您才会相信这一点。这看起来很简单,但在简单的操作中,这些DDL创建调用可以很好地解释完成内部存储过程所需的大部分时间。

@splaten,自己试试看。。。我不知道怎么做,我试过这样做:如果存在tbl_HeadOfDepts,就删除临时表;创建临时表tbl_HeadOfDepts,将其插入tbl_HeadOfDepts调用RSHeadofDepartments(vcCompKey,biWho_id)@斯帕坦,那是错误的。如果有帮助,请参阅回答中的编辑。我不能用“选择”调用该过程。它是一个返回记录集的存储过程,只能用“调用”调用它。您所说的
记录集是什么意思?
create procedure rsHeadOfAnyDepartments(vcCompKey varchar(10), biWho_id int)
as
begin
DROP TEMPORARY TABLE IF EXISTS tbl_HeadOfDepts; 
CREATE TEMPORARY TABLE tbl_HeadOfDepts(col1 int, col2 varchar(10), col3 varchar(30));

INSERT INTO tbl_HeadOfDepts
SELECT col1, col2, col3
FROM tblTest;    
end