如何使用MySQL从存储过程中插入数据到临时表中。

28

这与问题653714非常相似,但是针对的是MySQL而不是SQL Server。

基本上,我有一个复杂的选择语句,是几个存储过程的基础。我想在这些存储过程之间共享代码,但是我不知道如何做到这一点。我可以通过将共享的选择语句作为存储过程来实现这一点,然后从其他存储过程中调用该存储过程。但我不知道如何处理嵌套存储过程的结果集。如果我能将它们放在临时表中,我就可以有效地使用结果,但我不知道如何将它们放入临时表中。例如,下面的代码是无效的:

CREATE TEMPORARY TABLE tmp EXEC nested_sp();
5个回答

18
问题在于,存储过程并不直接返回输出。它们可以在脚本中执行select语句,但没有返回值。
MySQL通过"CALL 存储过程名称();"来调用存储过程。由于存储过程不像函数一样有返回值,因此无法将输出直接定向到任何地方。 MySQL Call Command

尝试使用内联子查询。 - bobobobo
28
这是一个答案吗?解决方案在哪里? - serge
3
那么这不可能吗? - Samra
https://stackoverflow.com/a/12800300/551744 - Chaki_Black

7

无法使用存储过程进行“SELECT INTO”操作。

首先创建临时表,然后让您的存储过程使用常规“INSERT INTO”将查询结果存储到所创建的临时表中。只要删除该表或关闭连接,临时表就会消失。


6
也许这是一个封闭的话题,但我想提供一个基于MySQL临时表属性的解决方案。首先,创建临时表的方法不应该是调用存储过程"CREATE TEMPORARY TABLE tmp EXEC nested_sp();"。查询应该针对“基础设施”临时表(以某种方式命名)。
为了实现所需的结果,需要创建两个存储过程。第一个存储过程处理数据并填充临时的“基础设施”表,第二个存储过程读取此表并继续处理,最后“DROP”“基础设施”表。
以下是第一个存储过程:
    CREATE DEFINER = 'root'@'localhost'
PROCEDURE cajareal.priv_test()
BEGIN
  CREATE TEMPORARY TABLE IF NOT EXISTS  tmp(
      column1 TEXT
    , column2 TEXT
    , column3 TEXT
    );



  INSERT INTO tmp(column1, column2 , column3) VALUES(CURDATE(), CURRENT_DATE(), CURRENT_TIMESTAMP());

END

这是第二个存储过程:

CREATE DEFINER = 'root'@'localhost'
PROCEDURE cajareal.priv_caller()
BEGIN
  CALL priv_test;

  -- Read data of "infrastructure" table
  SELECT * FROM tmp;


  -- Do the business logic


  -- Delete the "infrastructure" table
  DROP TABLE tmp;
END

我使用这种技术来分析字符串并将其转换为表格。

2
这应该是被接受的答案 - 它是唯一一个用可用的解决方案回答问题的东西。 - Jon Vote

5

我的第一反应是“听起来像是一个视图”。这样抽象化是否足够,使您可以在每种情况下仅将可变性添加到SP中呢?

任何增加临时表的做法,如果没有必要,都很可能是反模式。


5
我知道这有点晚了,但是因为花费了很长时间才找到一个真正的解决方案,所以我想分享一下。我做了一个如下所示的例子。
创建的表格如下:
CREATE TABLE BOOK(
B_ID INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(B_ID),
TITLE VARCHAR(100),
DESCRIPTION VARCHAR(30),
PRICE DOUBLE);

CREATE TABLE BOOK_COMMENT(

PRIMARY KEY(B_C_ID),
B_C_ID INT NOT NULL AUTO_INCREMENT,
REMARK VARCHAR(120),
B_ID INT,
FOREIGN KEY(B_ID) REFERENCES BOOK(B_ID));

CREATE TABLE AUTHOR(
A_ID INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(A_ID),
A_NAME CHAR(15),
B_ID INT,

FOREIGN KEY(B_ID) REFERENCES BOOK(B_ID));
  1. 分隔符

CREATE PROCEDURE BOOK_IMPORTANT( _PRICE DOUBLE, _B_ID INT, A_NAME CHAR(15), _BD_ID INT)

BEGIN

INSERT INTO BOOK(PRICE)

VALUES(_PRICE);

SET _B_ID=LAST_INSERT_ID();

INSERT INTO BOOK_COMMENT(B_ID)

VALUES(_B_ID);

SET _BD_ID=LAST_INSERT_ID();

INSERT INTO AUTHOR(A_NAME,B_ID)

VALUES(A_NAME,_BD_ID);

END

然后使用以下内容插入值。
CALL BOOK_IMPORTANT('0.79',LAST_INSERT_ID(),'',LAST_INSERT_ID());

LAST_INSERT_ID() 函数获取表中最后一个自增 ID,并将其插入到子表的引用列中。

在过程参数中,_B_ID_BD_ID 代表了 B_ID,因为我需要在两个表中都使用 B_ID 作为外键。

抱歉有些冗长。其他人都希望你能自动知道如何做。希望这有所帮助。


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