环境:MySQL 5.1,Linux
我有一个存储过程,可以从单个输入值计算多个值。值作为OUT参数返回。我想为每个行集调用此过程,并将值显示为结果集中的列。这些值具有复杂的关系,因此不容易构造每个值的不同函数。
问题:如何让OUT参数显示为表格中的列?
这是我到目前为止所拥有的:
DELIMITER $_$
DROP PROCEDURE IF EXISTS in_out;
CREATE PROCEDURE in_out (
IN s TEXT,
OUT op TEXT,
OUT opn INT,
OUT opd TEXT,
OUT len INT
)
BEGIN
SET op = 'del';
SET opn = 1;
SET opd = substr(s,4);
SET len = LENGTH(SUBSTR(s,4));
END
$_$
DELIMITER ;
然后:
mysql> call in_out('delACT',@op,@opn,@opd,@len);
Query OK, 0 rows affected (0.00 sec)
mysql> select @op,@opn,@opd,@len;
+------+------+------+------+
| @op | @opn | @opd | @len |
+------+------+------+------+
| snv | 1 | ACT | 3 |
+------+------+------+------+
1 row in set (0.00 sec)
到目前为止一直很好,但我无法弄清楚如何为每一行调用此过程并在结果集中返回结果。我想要的是这样的:
dream> select mycol,in_out(mycol) from mytable
+---------+------+------+------+------+
| mycol | @op | @opn | @opd | @len |
+---------+------+------+------+------+
| delACT | del | 1 | ACT | 3 |
+---------+------+------+------+------+
谢谢!
答案 0 :(得分:1)
您混淆了存储过程和存储的函数:
如果你想“从mytable中选择mycol,in_out(mycol)”,你必须:
CREATE FUNCTION in_out( ...
答案 1 :(得分:1)
这似乎是一个棘手的问题:人们无法在MySQL中创建函数/过程结果中的表关系。我最终重构为单独的函数(如Michał所建议的那样)。我一直希望MySQL等同于PostgreSQL的表函数(http://goo.gl/77QVE)。
答案 2 :(得分:0)
我建议在存储过程中为每个可能的值准备数据:
select distinct mycol
from mytable
where <... condition that you would use anyway in final result ...>
其中mycol
是存储过程的参数,将其保存到临时表中,然后连接到此值。
-- way the temp table may look in your sp
create temporary table tmptable (
mycol text
op text,
opn int,
opd text,
len int
)
之后使用join:
select m.mycol, t.op, t.opn, t.opd, t.len
from mytable m
join tmptable t on m.mycol = t.mycol
where <... condition that you would use anyway in final result ...>
有点不同的问题,您是否绝对相信使用存储过程没有不同的方法来处理您的最终结果?