为什么这个MySQL存储过程不能像我想要的那样工作?

时间:2011-04-26 14:20:49

标签: mysql stored-procedures

我想要一个存储过程来创建一个临时表,用数据填充表,然后返回表。这就是我所拥有的:

CREATE PROCEDURE sp_create_r3(p_panel_id INT)
BEGIN
    -- create new temporary table
    DROP TABLE IF EXISTS temp;
    CREATE TEMPORARY TABLE temp(assembly_id INT, cost1 DECIMAL(10,2), cost2 DECIMAL(10,2));

    -- populate table
    SELECT sf_assembly_breakdown(assembly_id) AS dummy FROM panel_assembly WHERE panel=p_panel_id;

    -- return table
    SELECT * FROM temp;
END

CREATE FUNCTION sf_assembly_breakdown (p_assembly_id INT) RETURNS INT
BEGIN
    DECLARE cost1 DECIMAL(10,2);
    DECLARE cost2 DECIMAL(10,2);

    -- calculate cost1, cost2 here
    ...


    -- insert data into temporary table
    INSERT INTO temp SELECT p_assembly_id , cost1, cost2;

    -- return dummy value
    RETURN NULL;
END

虽然这不起作用! sp_create_r3返回的结果集是由:

生成的
SELECT sf_assembly_breakdown(assembly_id) AS dummy FROM panel_assembly WHERE panel=p_panel_id;

我不想归还这个。我想退回SELECT * FROM temp;

这可能吗?如果不是什么选择?

2 个答案:

答案 0 :(得分:1)

我建议您以不同的方式设置临时表:

create temporary table temp select p_assembly_id, cost1, cost from panel_assembly where panel=p_panel_id;

或使用SELECT ... INTO语法。

答案 1 :(得分:0)

您的例程将返回与其中包含SELECT语句一样多的数据集。因此,返回的第一个数据集是您指定的,返回的第二个数据集是您想要的。

我知道有C和PHP的API可以处理从例程返回的多个结果集,但是如果你没有使用其中任何一个,那么你可能需要寻找一个满足你的库。需要。