gpt4 book ai didi

mysql - 如何从内部调用存储过程获取记录集?

转载 作者:行者123 更新时间:2023-11-29 20:58:35 30 4
gpt4 key购买 nike

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

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

    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,因为“rsHeadOfAnyDepartments”不是函数,但这不会被接受。

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

    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

最佳答案

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

根据您的软件和同时存在多个调用者的实际情况,您可能需要在某些控制表中包含带有 auto_increment (AI) 列的 session ID 概念。这将确保在并发情况下,多个调用者不会互相破坏对方的行,从而使其不可行。

该 session 在高级别上的运作方式如下。内部存储过程将从控制表中获取一个 AI 值 (theSession),使用它来填充工作表中的安全分段 session ,并作为 out 参数到外部(调用)存储过程。然后,外部行可以安全地使用这些行,并在最后进行清理(从工作表中删除 sessionId=theSession)。

为什么我建议使用非临时工作台?需要明确的是,工作台不是临时的。首先,让 if isn't drop 工作起来很麻烦。但最重要的是,它与性能有关。创建临时表的 DDL 调用并不便宜。只有当你进行性能测试以了解我的意思时,你才会相信这一点。这可能看起来微不足道,但在微不足道的操作中,这些创建的 DDL 调用很可能占内部存储过程完成所需时间的大部分。

关于mysql - 如何从内部调用存储过程获取记录集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37419928/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com