调用 MySQL 中的一个存储过程,并将值插入临时表中

7

我有两个过程,分别是proc1和proc2。我正在一个过程中调用另一个mysql过程。

在proc1中,我想将proc2的值插入到proc1的临时表中。Proc2返回两列,但我只想将一列插入到proc1的临时表中。

proc2的输出如下:

Hrs(Timestamp)    Status
09:30             IN,OUT,IN,OUT 
04:30             IN,OUT
07:30             IN,OUT,IN,OUT
04:25             IN,OUT

Proc1 代码

CREATE PROCEDURE Proc1()
BEGIN
   DROP TABLE IF EXISTS TempWorkedHrs ;
   CREATE TEMPORARY TABLE TempWorkedHrs(WorkedHrs TIMESTAMP); 

   INSERT INTO TempWorkedHrs(WorkedHrs)
   CALL Proc2(); 

   SELECT SUM(WorkedHrs) INTO @TotalHrs
     FROM TempWorkedHrs;        
END //

当我在proc1中向临时表插入值时,proc2中的第二列对我来说没有任何意义。

问题1:如何将从存储过程返回的特定列插入到临时表中?在我的情况下是proc2的第一列。


我想在proc1中使用已经存在的proc2,并将proc2返回的值插入到proc1的临时表中。 - ArrayOutOfBound
2
你能展示一下proc2的样例代码吗?我不太明白你们具体想做什么... - SQL.injection
2个回答

4
短回答:这是不可能的。
长回答:虽然不可能,但有一些变通方法可以实现相同的效果。
选项1:向临时表添加一个虚拟列。从Proc2中插入所有列到临时表中。然后删除虚拟列。这种方法不太好。
选项2:向Proc2添加一个参数,BOOLEAN可能是一个不错的选择。根据参数值插入更多或更少的列。这种方法比较好。
选项3:你真的需要Proc2成为一个过程吗?换句话说,在选择数据之前,它是否真的修改了数据(或更一般地说,环境)?换句话说,在这种情况下,一个视图是否更合适?
[编辑]
感谢James Holderness的指引,我意识到你可能不知道存储过程没有返回值(没有办法绕过它)。我认为你所说的“Proc2返回数据”,实际上是“Proc2将一些数据写入TempWorkedHrsProc1将读取它们”。如果可能的话,请避免这种方法(无论是选项1还是2都不太好)。在这里,你很可能需要一个视图。

根据0xCAFEBABE的评论,这确实是一个有点奇怪的用例,但是嘿,既然你问了,那就回答吧。我也希望我能回答X。 - RandomSeed
1
我曾认为在mysql中不可能像“INSERT INTO ... CALL”这样做,因为存储过程不返回任何内容。因此,选项1和2都没有帮助。问题不在于列数 - 没有任何方法可以以任何形式获取结果。或者我对此错了吗? - James Holderness
@JamesHolderness 实际上,一个过程没有返回值。我们使用了不正确的语言快捷方式,“P2将数据返回给P1”,实际上是指“P2在临时表(TempWorkedHrs)中插入一些数据,在P2完成后,P1能够读取这些数据”。 - RandomSeed
啊...我明白你的意思了。我以为这个事实对OP来说很清楚,现在我意识到他/她实际上希望能够做类似于这样的事情。感谢指点。 - RandomSeed

0

这不是一个好的做法,但你可以使用触发器来执行你的程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接