Почему эта хранимая процедура MySQL не работает так, как я хочу? - PullRequest
0 голосов
/ 26 апреля 2011

Я хочу, чтобы хранимая процедура создала временную таблицу, заполнила таблицу данными, а затем вернула таблицу.Вот что у меня есть:

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 ]

1 голос
/ 26 апреля 2011

Я бы порекомендовал вам настроить временную таблицу по-другому:

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

или использовать синтаксис SELECT ... INTO.

0 голосов
/ 26 апреля 2011

Ваша подпрограмма вернет столько наборов данных, сколько в ней SELECT операторов. Итак, первый возвращенный набор данных - это то, что вы указали, а второй возвращенный набор данных - то, что вы хотите.

Есть API-интерфейсы для C и PHP, о которых я знаю, которые могут работать с несколькими наборами результатов, возвращаемых из подпрограммы, однако, если вы не используете ни один из них, вам, возможно, придется искать библиотеку, которая соответствует вашим требованиям. необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...