如何在MySQL过程中选择参数作为表列?

时间:2011-12-06 05:46:36

标签: mysql sql stored-procedures

环境: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 |
+---------+------+------+------+------+

谢谢!

3 个答案:

答案 0 :(得分:1)

您混淆了存储过程和存储的函数:

  • 存储函数将返回一个值,结果可以用于 表达式(如COS()和其他mysql内置函数)。
  • 存储过程需要使用CALL,是一个独立的操作,不能 用在表达式中。

如果你想“从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 ...>

有点不同的问题,您是否绝对相信使用存储过程没有不同的方法来处理您的最终结果?