我有一个存储过程,在内部我想调用另一个返回记录集的过程,如何通过“ CALL”导航存储过程返回的记录集?
[edit]我一直在尝试按照建议使用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
不可以,存储过程可以生成结果集,但不能作为内部调用对其他存储过程的输出直接使用它们。从性能角度考虑,最好的办法是填充非临时工作表并使用结果。
根据您的软件和同时存在多个调用者的实际情况,您可能需要AI
在某些控制表中包含带有id的auto_increment()列的会话ID概念。这样可以确保在并发的情况下,多个调用者不会踩对方的行,从而使其不可行。
下面是该会议在更高层次上的工作方式。内部存储的proc将从控制表中获得一个AI
值(theSession
),使用它在工作表中填充一个安全分段的会话,并将其作为out
参数返回给外部(调用)存储的proc。然后,该外部行可以安全地使用这些行,并在末尾(delete from workTable where sessionId=theSession
)进行清理。
为什么我建议使用非临时工作表?需要明确的是,该工作表将是非临时的。首先,if exists drop
工作变得很麻烦。不过,最重要的是,它与性能有关。临时表创建的DDL调用并不便宜。只有在进行性能测试以了解我的意思时,您才会相信这一点。这看似微不足道,但在微不足道的操作中,那些对DDL的创建调用可以很好地说明内部存储过程完成所需的大部分时间。
问题内容: 我有一个需要很多参数的插入存储过程-其中2个是@ FirstName,@ LastName。我还有一个更新存储过程,该过程需要许多参数-其中2个是@ FirstName,@ LastName。 我想做的是,从插入SP内部完成之后,调用更新SP并将其发送给@ FirstName,@ LastName。 我不知道这样做的正确语法;我试过了: 但我认为这是错误的。 有人可以告诉我怎么写这个电
在使用JDBC处理SQL Server存储过程时,我偶尔会遇到两种形式的奇怪行为: 问题1:我在SQL Server Management Studio(SSMS)中运行一个存储过程,它返回一个结果集。然而,当我试着 我有个例外 com.microsoft.sqlserver.jdbc.sqlserverexception:语句未返回结果集。 问题2:我在SSMS中运行了一个存储过程,它引发了一个
问题内容: 我有一个已过时的存储过程,不应再从代码中调用它,但是有些系统仍在调用它。这是生产服务器,因此我只能非常有限地间接访问它以执行诊断。 有什么方法可以确定从sproc内部调用特定存储过程的机器吗?诸如@@ CallingMachineIP或@@ CallingMachineName之类的东西 问题答案: 或者
本文向大家介绍在foreach PHP Codeigniter内部调用存储过程,包括了在foreach PHP Codeigniter内部调用存储过程的使用技巧和注意事项,需要的朋友参考一下 需要更改“模型”和“控制器”内部的代码,以包括如下所示的代码: 在“控制器”内部 在“模型”内部
问题内容: 我正在处理一个查询(一个SELECT),我需要将此查询的结果插入表中。在进行插入之前,我需要做一些检查,如果所有列都有效,我将进行插入。 该检查是在存储过程中完成的。在其他地方也使用相同的过程。因此,我正在考虑使用相同的过程进行检查。 程序进行检查并插入值都可以。 我试图在SELECT内调用该过程,但是它不起作用。 这种代码不起作用。 我认为可以使用游标完成此操作,但我想避免使用游标。
我想用java调用一个记录类型表的存储过程。记录只包含数字,但我必须传递整数和小数。 我还没有为我的问题找到合适的解决方案(无论是OracleCallableStatement还是StoredProcedurey)。