这与问题653714非常相似,但对于MySQL而不是SQL Server。
基本上,我有一个复杂的选择,它是几个存储过程的基础。我想在存储过程中共享代码,但是,我不知道如何做到这一点。我可以这样做的一种方法是使共享选择一个存储过程,然后从其他存储过程调用该存储过程。我无法弄清楚如何使用嵌套存储过程的结果集。如果我可以将它们放在临时表中,我可以有效地使用结果,但我无法弄清楚如何在临时表中获取它们。例如,这不起作用:
CREATE TEMPORARY TABLE tmp EXEC nested_sp();
答案 0 :(得分:12)
问题是,存储过程并不直接返回输出。他们可以在脚本中执行select语句,但没有返回值。
MySQL通过CALL StoredProcedureName();
调用存储过程并且您无法将该输出定向到任何内容,因为它们不返回任何内容(与函数不同)。
答案 1 :(得分:5)
我的第一反应是“这听起来像是对我的看法”。这不足以抽象它,所以你可以在每个案例中将可变性添加到SP中吗?
任何添加临时表的东西都不会出现反模式。
答案 2 :(得分:4)
我知道这已经很晚了但是因为我花了很长时间才找到一个真正的解决方案,我可能会分享。我研究了下面的一个例子。
创建的表格是:
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));
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()
获取表的最后一次自动增量并将其插入子表的引用列。
在过程中,参数_B_ID
和_BD_ID
代表B_ID
,因为我需要B_ID
作为两个表中的外键。
对于多余的措辞感到抱歉。所有其他人都希望你自动知道如何做到这一点。希望它有所帮助
答案 3 :(得分:4)
您无法使用存储过程“SELECT INTO”。
首先创建临时表,并使用正常的“INSERT INTO”将存储过程存储到创建的临时表中。只要您放下临时表或直到连接关闭,临时表就会可见。
答案 4 :(得分:1)
也许这是一个封闭的话题,但是我想提供一个基于MySQL临时表属性的解决方案。首先,创建临时表的方法不是调用存储过程“ CREATE TEMPORARY TABLE tmp EXEC nested_sp();”。查询到“基础结构”的临时表(以某种方式命名)。
要获得所需结果,必须创建2个存储过程,第一个存储过程处理数据并填充临时“基础结构”表,第二个存储过程读取该表并继续该过程,最后“ 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 bussiness logic
-- Delete the "infrastructure" table
DROP TABLE tmp;
END
我使用这种技术来分析字符串并将其转换为表格