Как я могу выбрать параметры в процедуре MySQL как столбцы таблицы? - PullRequest
3 голосов
/ 06 декабря 2011

Среда: MySQL 5.1, Linux

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

Вопрос: Как я могу получить параметры OUT для отображения в виде столбцов в таблице?

Вот что у меня есть:

DELIMITER $_$
DROP PROCEDURE IF EXISTS in_out;
CREATE PROCEDURE in_out (
       IN s TEXT, 
       OUT op TEXT, 
       OUT opn INT,
       OUT opd TEXT,
       OUT len INT
       )
BEGIN
        SET op = 'del';
        SET opn = 1;
        SET opd = substr(s,4);
        SET len = LENGTH(SUBSTR(s,4));
END
$_$
DELIMITER ;

Тогда:

mysql> call in_out('delACT',@op,@opn,@opd,@len);
Query OK, 0 rows affected (0.00 sec)

mysql> select @op,@opn,@opd,@len;
+------+------+------+------+
| @op  | @opn | @opd | @len |
+------+------+------+------+
| snv  |    1 | ACT  |    3 |
+------+------+------+------+
1 row in set (0.00 sec)

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

dream> select mycol,in_out(mycol) from mytable
+---------+------+------+------+------+
| mycol   | @op  | @opn | @opd | @len |
+---------+------+------+------+------+
| delACT  | del  |    1 | ACT  |    3 |
+---------+------+------+------+------+

Спасибо!

Ответы [ 3 ]

1 голос
/ 06 декабря 2011

Вы путаете хранимые процедуры и хранимые функции:

  • сохраненная функция будет возвращать значение, результаты могут быть использованы в выражения (например, COS () и другие встроенные функции mysql).
  • хранимой процедуре нужно использовать CALL, является самостоятельной операцией, не может использоваться в выражениях.

Если вы хотите «выбрать mycol, in_out (mycol) из mytable», вы должны:

CREATE FUNCTION in_out( ...
1 голос
/ 19 декабря 2011

Похоже, это хитрый вопрос: нельзя создать табличные отношения из результатов функций / процедур в MySQL. Я закончил рефакторинг на отдельные функции (как предложено Михалем). Я надеялся на MySQL, эквивалентный табличным функциям PostgreSQL (http://goo.gl/77QVE).

0 голосов
/ 06 декабря 2011

Я бы рекомендовал подготовить данные в хранимой процедуре для каждого возможного значения в:

select distinct mycol
from mytable
where <... condition that you would use anyway in final result ...>

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

-- way the temp table may look in your sp
create temporary table tmptable (
    mycol text
    op text, 
    opn int,
    opd text,
    len int
)

после этого использования join:

select m.mycol, t.op, t.opn, t.opd, t.len
from mytable m
join tmptable t on m.mycol = t.mycol
where <... condition that you would use anyway in final result ...>

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

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