2013-10-27 3 views
0

У меня есть хранимая процедура, которая возвращает несколько значений (1 строка). Мне нужно использовать результаты этой хранимой процедуры в запросе выбора.Использовать результаты хранимой процедуры в операторе select [MySql]

Вот псевдокод того, как бы мне хотелось (такой синтаксис не существует, но давайте сделаем вид, что он позволит сохранить 3 значения, которые моя хранимая процедура возвращает, в C, D и E):

SELECT 
    t1.A, t1.B, 
    MyStoredProc(t1.A) AS (C, D, E) 
FROM 
    t1 
ORDER BY 
    D 
LIMIT 
    1 

(на стороне клиента, мне нужно, чтобы получить A, B, C, D и E)

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

+0

Почему бы не вызвать вашу хранимую функцию три раза, с разными параметрами? – eggyal

+0

eggyal, я не уверен, что понимаю, что вы имеете в виду. – nightcoder

+0

'SELECT t1.A, t1.B, myStoredFunc (t1.A, 1) AS C, myStoredFunc (t1.A, 2) AS D, myStoredFunc (t1.A, 3) AS E FROM t1 ORDER BY D LIMIT 1 ' – eggyal

ответ

0

Вы не можете получить доступ к значениям из набора результатов, возвращаемого хранимой процедурой в рамках другого запроса. Они отправляются только клиенту. Результат выглядит как таблица, но это не таблица.

Существует, однако, обходной путь, описанный здесь:

How to use Table output from stored MYSQL Procedure

Он не получает вас именно там, где вам нужно идти, но он получает вы так близко, как вы можете получить.

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

IF NOT @__cached__function_input <=> input_arg THEN 
    SET @__cached__function_input = input_arg; 
    SELECT complicated, logic, things INTO @__cached__a, @__cached__b, @__cached__c; 
END IF; 

RETURN @__cached__a; # in function "a" -- return b in b and c in c 

Если вы используете уникальные имена переменных для любой заданной функции, они не будут сталкиваться. Функции выполняются серийно, а не параллельно, даже для данных в той же строке оператора, который возвращает несколько строк.

+0

Michael, в моем случае, чтобы использовать временную таблицу, мне сначала нужно получить все значения t1.A, которые возвращает мой запрос (см. Вопрос), тогда мне придется вызвать хранимую процедуру для каждого значения t1.A и заполнить временную таблицу, а затем мне придется выполнить окончательный запрос с присоединением во временную таблицу. Не очень элегантный. – nightcoder

Смежные вопросы