Задавайте вопросы, мы ответим
Вы не зашли.
Здраствуйте. Вопрос возможно ли вызывать процедуры из select? (в mssql можно вроде только функции). Функцию надеюсь можно вызывать из select?(пока не пробовали), но не хотелось бы, т.к. она возвращает только 1 значение. Нужно из одной таблички по ключу выводить несколько значений (столбцов), и затем вызывать из разлинных запросов.
Вариант 1: писать на каждое значение (столбец) функцию.
Вариант 2: писать одну функцию и там в зависимости от входного параметра выводить значение нужного столбца.
Вариант3:очень хочется как-то вызвать процедуру которая возвращает 1 строку и несколько столбцов, Возможно ли это или есть другие варианты??? подскажите на примере плз.
Неактивен
Нет, из SELECT процедуры вызывать нельзя, можно только функции.
Dimon написал:
Нужно из одной таблички по ключу выводить несколько значений (столбцов), и затем вызывать из разлинных запросов
А почему бы не написать процедуру, которая все это сама и делает? (в процедуре-то можно делать сколько угодно и практически каких угодно запросов).
Вообще будет удобнее, если Вы опишите задачу более детально.
Неактивен
Описываю: Есть несколько таблиц (5), в кот. хранится инфо по человеку (улица, дом, квартира и т.д.).
Есть отчеты (около 50) в которых эта информация выводится. Так вот чтобы каждый раз в каждый отчет не впихивать эти 5 таблиц была идея написать что-то типа универсальной процедуры, кот. возвращает кучу инфы по человеку, а в зависимости от отчета использовать только нужную, т.е. вызывается процедура, а из нее в selecte выводим например только 1,3,5 параметр. Насколько я понял остается только Вариант 1 и 2, ну или в каждом отчете подключать эти зложастные 5 таблиц?
Неактивен
А почему непосредственно в процедуре нельзя динамически SELECT сформировать?
Неактивен
1. в смысле? не понял. Есть отчеты - селекты с кучами критериев и в них надо вызывать (во многих случаех одну и туже) инфу по человеку (якобы процедурку), где формировать динамический запрос в процедурке - инфо по человеку?
2. для примера напишите составной селект в процедуре в зависимости от того есть ли входной параметр.
у нас есть вариант такой:
процедура с параметром inparam
select * from tbl
where (tbl.uniq = inparam or tbl.uniq is null)
Неактивен
Входных параметров всегда должно быть нужное количество (иначе случится ошибка).
Динамически формировать список нужных столбцов можно двумя способами:
1. Использовать в процедуре PREPARE STATEMENT:
CREATE PROCEDURE easy (IN fieldlist VARCHAR(255), IN inparam INT)
BEGIN
-- параметр fieldlist - список нужных столбцов
-- сначала формируем строку запроса
SET @q = CONCAT(
'SELECT ',fieldlist,' FROM tbl WHERE tbl.uniq = ',inparam,' OR tbl.uniq IS NULL)'
);
-- теперь готовим и выполняем PREPARE STATEMENT
PREPARE st FROM @q;
EXECUTE st;
END $$
2. В процедуру передавать определенного вида флаги, которые говорят о наличии/отсутствии соотв. колонок в запросе (но это достаточно трудоемкий путь):
DELIMITER $$
CREATE PROCEDURE gemor (IN flag INT)
BEGIN
/*
можно так: каждому flag соответсвует определенная колонка:
flag = 1 - col1,
flag = 2 - col2,
flag = 4 - col3
соответственно, flag = 3 (1+2)- выбрать col1 и col2,
flag = 5 (1+4) - выбрать col1 и col3,
flag = 7 (1+2+4) - выбрать col1, col2 и col3
и т.д.
это достаточно строго, но имхо оч. геморно...
*/
CASE flag
WHEN 1 THEN
SELECT col1 FROM tbl;
-- здесь опущена часть WHERE;
-- конечно, и для нее можно передать параметр
WHEN 3 THEN
SELECT col1, col2 FROM tbl;
WHEN 7 THEN
SELECT col1, col2, col3 FROM tbl;
END CASE;
-- ит.д.
END $$
DELIMITER ;
А почему нельзя динамически формировать SELECT с уже только нужными столбцами непосредственно на клиенте, до отсылки серверу MySQL?
Неактивен
Спасибо за подробный ответ, но я немного не то имел ввиду. В клиенте формировать динамический запрос конечно можно, но для нас немного критично формировать имеено на сервере (но это не то).
Насчет первого примера - мы это тоже в курсе, но я имел ввиду критерии уже в условии where, т.е. если входной параметр null, то его не учитывать в условии (но это другой вопрос). Насчет первого постараюсь объяснить еще раз что нужно.
есть селекты (процедурки) - отчеты, например (как хотелось бы):
select a.q,
a.w,
b.e,
где-то здесь вызов нескольких столбцов из той самой какой-то типа процедурки инфо абонента.
типа call info(key) на выходе как-то столбцы например 1, 2, 5
c.r
from a
inner join b ...
inner join c ...
в другом отчете тоже вызов но например столбцов 2,3,5
ну и сама процедурка
create procedure (inkey)
select 1.t as 1, 2.t as 2, 1.y as 3, 2.u as 4...
from t
inner join y ...
inner join u ...
where 1.key = inkey limit 1
Вот что хотелось бы, но процедуру нельзя вызвать понятно, есть ли какой-то обходной путь?
Неактивен
А функция Вас не устроит?
Неактивен
А нельзя ли сделать один или несколько VIEW, имеющих нужный Вам набор колонок, и их вызывать?
Неактивен
1. paulus: проблема функции в том, что она возвращает одно значение (или я не прав?), а нам надо несколько 'столбцов'.
2. LazY: View сделать нельзя, т.к. они оч.большие и по всем записям (а надо только из запроса-отчета, так быстрее), они работают через запись на диск, что замедляет работу.
3. Кстати в связи с View, есть еще вопрос, при создании темповой таблицы нельзя работать в соответствующих таблицах (кот. в запросе на создание тепм таблицы). Пока не разбирались может подскажете, может таблица блокируется на запись или еще что-то, исп. InnoDB?
Неактивен
3. В Innodb реализована мультиверсиооность, поэтому таблицы не блокируются, см также тему: http://sqlinfo.ru/forum/viewtopic.php?id=276
Неактивен
1. Что мешает написать несколько функций - по количеству столбцов?
Неактивен