模拟存储过程中的函数调用

时间:2012-11-01 16:19:49

标签: mysql stored-procedures syntax

(以下查询是对实际问题的极端简化,为了清晰的代码)

我有一个存储过程,其中有一个查询:

SELECT
   f1,
   f2
FROM
   T1
WHERE
   T1.id IN (SELECT complex_id FROM t2 WHERE complex='condition')

我想在其他存储过程中重用内部查询(SELECT complex_id FROM t2 WHERE complex='condition'),但在只有一个地方中维护它的语法。
我如何使用DB对象(SP,触发器等)和没有外部代码(如PHP等)来实现这一目标。

1 个答案:

答案 0 :(得分:1)

您应该创建一个视图:http://dev.mysql.com/doc/refman/5.5/en/create-view.html

CREATE VIEW reusable_query AS
SELECT complex_id FROM t2 WHERE complex='condition';

然后你可以:

SELECT * FROM t1 WHERE id IN (SELECT complex_id FROM reusable_query);

您可以使用如下存储过程更进一步:

CREATE FUNCTION isInReusableQuery(param INT) RETURNS BOOL
DELIMITER //
BEGIN
    DECLARE cnt INT;
    SELECT COUNT(complex_id) INTO cnt FROM reusable_query
    WHERE
        complex = 'condition'
        AND complex_id = param;
    RETURN cnt > 0;
END //
DELIMITER ;

允许你做这样的事情:

SELECT * FROM t1 WHERE isInReusableQuery(id);
但是,我可能不会推荐后者。从存储的函数查询视图可能会阻止某些optimisations