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

我有一个存储过程,在内部我想调用另一个返回记录集的过程,如何通过’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,stored-procedures,mariadb

来源: https://codeday.me/bug/20190928/1825456.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值