mysql – 如何从内部调用到存储过程获取记录集?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – 如何从内部调用到存储过程获取记录集?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2449字,纯文字阅读大概需要4分钟。
内容图文
我有一个存储过程,在内部我想调用另一个返回记录集的过程,如何通过’CALL’导航存储过程返回的记录集?
[编辑]我一直在尝试使用TEMPORARY TABLE,但有问题:
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)列的会话ID概念.这将确保在并发时,多个调用者不会在彼此的行上踩踏,从而使其不可行.
该会议如何在高层次上发挥作用如下.内部存储过程将从控制表中传递一个AI值(theSession),用它来填充工作表中安全分段的会话,并作为out参数返回到外部(调用)存储过程.那个外层可以安全地使用那些行,并在最后清理(从workTable中删除sessionId = theSession).
为什么我建议使用非临时工作台?需要明确的是,工作台将是非临时的.首先,让if exists drop工作变得麻烦.但最重要的是,它与性能有关.创建临时表的DDL调用并不便宜.当你进行性能测试以了解我的意思时,你才会相信这一点.这看起来似乎微不足道,但是在琐碎的操作中,那些DDL调用创建可以很好地解释内部存储过程完成所需的大部分时间.
内容总结
以上是互联网集市为您收集整理的mysql – 如何从内部调用到存储过程获取记录集?全部内容,希望文章能够帮你解决mysql – 如何从内部调用到存储过程获取记录集?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。