我想知道是否可以将查询结果存储到我正在编写的存储例程中的MySQL数据库中的存储例程中的类字符串变量中。
@The Scrum Meister:
这就是我现在所拥有的:
DELIMITER $$
CREATE PROCEDURE `mydb`.`markCompanyAsHavingInactiveEmployees` ()
BEGIN
DECLARE company TEXT;
SET @company := 'SELECT company FROM Employees WHERE status=2';
-- Can I make an array inside of stored procedures?
END
它不完整,我不知道它是否会得到我想做的。但是,就是这样。
@siride:
我要做的是将记录中的字段从Company表设置为某个值,这取决于在Employee表的记录中找到的内容。
这是我正在尝试做的伪代码:
DELIMITER $$
CREATE PROCEDURE `mydb`.`markCompanyAsHavingInactiveEmployees` ()
BEGIN
DECLARE companies TEXT;
SET @companies := 'SELECT company FROM Employees WHERE status=2';
DECLARE i INT;
WHILE(i<=companies.length)
{
DECLARE company TEXT;
company = "";
if(companies.charAt(i)!='\n') company.concat(companies.charAt(i));
DECLARE stmt TEXT;
stmt = CONCAT('UPDATE Companies SET HaveInactiveEmployees=1 WHERE name=\'', company, '\'');
i++;
}
END
我认为这样的事情不会在MySQL例程中有效,但如果可以的话,我会这样做。
答案 0 :(得分:0)
您不能在存储过程中创建数组,但您可以创建临时表(当然,具有正确的权限)。
更多关于你的主要问题,你想运行查询并以某种方式将结果连接成一个字符串,可能由某些东西分隔?如果是这种情况,您可以在存储过程中使用类似的内容:
SELECT GROUP_CONCAT(company SEPARATOR '|') INTO company
FROM Employees WHERE status = 2
GROUP BY status;
这将为您提供“Acme Products,Inc。| Microsoft | Apple | ...”形式的单个字符串。
我不知道这是否能解决您的问题,因为正如该问题的一些评论员指出的那样,我们不确定究竟是什么问题。但希望它可以帮助你完成任务。
编辑:我查看了你的编辑(最后),看起来你正在尝试使用动态SQL,你可以在一个查询中做什么。我猜你来自繁重的编程背景,并且不习惯你在数据库中使用的关系逻辑。以下是您在单个查询中完成请求的示例:UPDATE Companies
JOIN Employees
ON Employees.company = Companies.name
SET Companies.HaveInactiveEmployees = 1
WHERE Employees.status = 2
您可能希望阅读UPDATE语句的MySQL文档(http://dev.mysql.com/doc/refman/5.0/en/update.html),以便更好地了解这里发生的事情。但基本上,我们加入公司名称上的公司和员工表,然后从结果表(一个联接基本上产生一个新表),我们选择状态字段的行(来自连接表的Employees部分)是2,对于每一行,我们将HaveInactiveEmployees字段更新为1.
请注意,这不是执行此操作的唯一方法。根据您的查询的语义,您似乎想要更新所有公司以指示他们是否有任何非活动员工。您可以这样表达:
UPDATE Companies
SET HaveInactiveEmployees = 1
WHERE Companies.name IN(SELECT company FROM Employees WHERE status = 2)
这也是做同样的事情,但它更清楚地表明你正在为每个不活跃的员工寻找公司名称(我认为这是状态2意味着什么)。获得该名称列表后,您将更新该列表中具有名称的所有公司条目。
在编程透视图中,我们有一个循环构造一个带有公司名称列表的数组,然后我们有另一个for循环遍历每个公司,如果公司名称在,则将HaveInactiveEmployees字段设置为1我们刚刚构建的数组。子查询基本上是嵌套循环。连接也是嵌套循环,但可以更高效。例如,此查询将比上面的查询运行得慢,但仅仅因为MySQL不够智能而无法正确优化它。逻辑或多或少相同,一个好的数据库引擎会为两个查询生成相同的执行计划。