Как получить набор записей из внутреннего вызова хранимой процедуры?

У меня есть хранимая процедура, внутренне я хочу вызвать другую процедуру, которая возвращает набор записей. Как получить набор записей, возвращенный хранимой процедурой, через «CALL»?

[править] Я пытался использовать TEMPORARY TABLE, как было предложено, но у меня возникли проблемы:

    DROP TEMPORARY TABLE IF EXISTS tbl_HeadOfDepts;
    CREATE TEMPORARY TABLE tbl_HeadOfDepts (biDept_id tinyint(4))
    INSERT INTO tbl_HeadOfDepts CALL rsHeadOfAnyDepartments(vcCompKey, biWho_id);

Мне нужно использовать CALL, потому что rsHeadOfAnyDepartments не является функцией, но это не будет принято.

Работа в процессе, но то, что у меня пока что не принято редактором:

    BEGIN
    #--
    # Procedure:
    #   rsWhoCanIaccess
    #
    # Parameters:
    #   vcCompKey, the key corresponding to the company
    #   biWho_id, the id of the person to check access for
    #
    # Returns:
    #   recordset containing all the people this person can access
    #--
        DECLARE tiSuperUser tinyint(4); 
        DECLARE EXIT HANDLER FOR SQLEXCEPTION
            BEGIN
                GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, 
                @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT;
                CALL procLogError(vcCompKey, CONCAT("rsWhoCanIaccess: "
                                        ,@errno, " (", @sqlstate, "): ", @text));
            END;        
    #Is this user a super user?
        SELECT tiIsSuperUser(vcCompKey, biWho_id) INTO tiSuperUser;
        SET tiSuperUser = 0;#Hack for testing
        IF (tiSuperUser = 1) THEN
    #The user is a superuser, return everyone in the company
            SELECT 
                t1.biPerson_id 
            FROM 
                tbl_people t1
            INNER JOIN
                tbl_companies t2
            ON
                t1.biCompany_id=t2.biCompany_id
            AND
                t2.vcKey=vcCompKey;         
        ELSE            
    #User is not a superuser, is the user head of any departments?
            DROP TEMPORARY TABLE IF EXISTS tbl_HeadOfDepts;
            CREATE TEMPORARY TABLE tbl_HeadOfDepts (biDept_id tinyint(4))
            INSERT INTO tbl_HeadOfDepts CALL rsHeadOfAnyDepartments(vcCompKey, biWho_id);

            SELECT * FROM tbl_HeadOfDepts;
        END IF;
    END

Ответы на вопрос(2)

которая возвращает набор записей,

В вашей внутренней процедуре создайтеTEMPORARY TABLE и заполнить эту временную таблицу, говоряinsert into your_temp_table select query, тогда вы можете использовать эту же временную таблицу в вашем внешнем запросе где угодно.

Это может быть даже обычная таблица, которая не обязательно должна быть временной таблицей. Также убедитесь, чтоDROP Таблица, как только ваша процедура вычисления выполнена как очистка.

Это неправильно для вашего комментария. Вы должны сделать это, как показано ниже (пример кода)

create procedure rsHeadOfAnyDepartments(vcCompKey varchar(10), biWho_id int)
as
begin
DROP TEMPORARY TABLE IF EXISTS tbl_HeadOfDepts; 
CREATE TEMPORARY TABLE tbl_HeadOfDepts(col1 int, col2 varchar(10), col3 varchar(30));

INSERT INTO tbl_HeadOfDepts
SELECT col1, col2, col3
FROM tblTest;    
end
 Rahul04 июн. 2016 г., 20:19
@SPlatten, это неправильно. См редактировать в ответ, если это поможет.
 SPlatten04 июн. 2016 г., 20:09
Будет ли это работать с CALL для хранимой процедуры?
 SPlatten04 июн. 2016 г., 20:23
Он не возвращает одно значение, но может содержать несколько строк значений.
 Rahul04 июн. 2016 г., 20:09
@SPlatten, попробуйте и убедитесь сами ... абсолютно все будет работать.
 SPlatten04 июн. 2016 г., 20:29
Вы не можете вызвать хранимую процедуру с помощью «SELECT», это работает только с функциями, и я использую хранимую процедуру, которая может быть вызвана только с «CALL».
 Rahul04 июн. 2016 г., 20:31
@SPlatten, ты внимательно прочитал ответ? Я знаю, как выполнить хранимую процедуру. В любом случае, ...
 SPlatten04 июн. 2016 г., 20:33
Я не понимаю, как это решает мою проблему, проблема в том, что хранимая процедура возвращает набор строк, и мне нужно каким-то образом поместить их во временную таблицу, чтобы я мог выполнять итерации.
 SPlatten04 июн. 2016 г., 20:15
Я не уверен, как это сделать, я пробовал это: DROP TEMPORARY TABLE IF EXISTS tbl_HeadOfDepts; СОЗДАТЬ ВРЕМЕННУЮ ТАБЛИЦУ tbl_HeadOfDepts КАК ВСТАВИТЬ В tbl_HeadOfDepts ВЫЗОВ rsHeadOfAnyDepartments (vcCompKey, biWho_id);
 Rahul04 июн. 2016 г., 20:23
Что вы подразумеваете подrecordset?
 SPlatten04 июн. 2016 г., 20:20
Я не могу вызвать процедуру с «SELECT», это хранимая процедура, которая возвращает набор записей, это можно вызвать только с «CALL»
 Rahul04 июн. 2016 г., 20:27
@SPlatten, это не должно быть проблемой вообще. Смотри правка снова, это пример ... делай изменения соответственно, и все должно работать нормально.
Решение Вопроса

хранимые процедуры могут создавать наборы результатов, но не использовать их напрямую в качестве выходных данных внутренних вызовов других хранимых процедур. Лучшее, что вы можете сделать с точки зрения производительности, - это заполнить временную рабочую таблицу и использовать результаты.

В зависимости от вашего программного обеспечения и реальности одновременного использования нескольких абонентов вам может потребоваться включить концепцию идентификатора сеанса с помощью auto_increment (AI) столбец в некоторой контрольной таблице. Это гарантировало бы, что при одновременном использовании несколько вызывающих абонентов не будут топтать строки друг друга, что делает его нежизнеспособным.

Как эта сессия будет работать на высоком уровне, заключается в следующем. Внутренний сохраненный процесс будет переданAI значение (theSession) из контрольной таблицы, используйте его для заполнения безопасного сегментированного сеанса в рабочей таблице и возврата в видеout параметр внешнего (вызывающего) хранимого процесса. Затем этот внешний мог бы безопасно использовать эти строки и очистить в конце (delete from workTable where sessionId=theSession).

Почему я предлагаю не временный рабочий стол? Чтобы было ясно, рабочий стол был бы временным. Прежде всего, есть хлопоты, связанные с получениемif exists drop работать. Самое главное, однако, это о производительности. DDL-вызовы для создания временных таблиц не являются недорогими. Вы будете верить этому, только когда будете тестировать производительность, чтобы понять, что я имею в виду. Это может показаться тривиальным, но в тривиальных операциях эти вызовы DDL для создания вполне могут составлять львиную долю времени, необходимого для завершения внутреннего хранимого процесса.

Ваш ответ на вопрос