Почему эта хранимая процедура MySQL не работает так, как я хочу?

#mysql #stored-procedures

#mysql #хранимые процедуры

Вопрос:

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

 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 ;

Возможно ли это? Если нет, то каковы альтернативы?

Ответ №1:

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

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

или используйте SELECT ... INTO синтаксис.

Ответ №2:

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

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