SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 28.11.2007 14:04:27

Dimon
Завсегдатай
Зарегистрирован: 06.09.2007
Сообщений: 45

Вызов функций в select?

Здраствуйте. Вопрос возможно ли вызывать процедуры из select? (в mssql можно вроде только функции). Функцию надеюсь можно вызывать из select?(пока не пробовали), но не хотелось бы, т.к. она возвращает только 1 значение. Нужно из одной таблички по ключу выводить несколько значений (столбцов), и затем вызывать из разлинных запросов.
Вариант 1: писать на каждое значение (столбец) функцию.
Вариант 2: писать одну функцию и там в зависимости от входного параметра выводить значение нужного столбца.
Вариант3:очень хочется как-то вызвать процедуру которая возвращает 1 строку и несколько столбцов, Возможно ли это или есть другие варианты??? подскажите на примере плз.

Неактивен

 

#2 28.11.2007 14:37:48

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 845

Re: Вызов функций в select?

Нет, из SELECT процедуры вызывать нельзя, можно только функции.

Dimon написал:

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

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

Вообще будет удобнее, если Вы опишите задачу более детально.

Неактивен

 

#3 28.11.2007 15:11:37

Dimon
Завсегдатай
Зарегистрирован: 06.09.2007
Сообщений: 45

Re: Вызов функций в select?

Описываю: Есть несколько таблиц (5), в кот. хранится инфо по человеку (улица, дом, квартира и т.д.).
Есть отчеты (около 50) в которых эта информация выводится. Так вот чтобы каждый раз в каждый отчет не впихивать эти 5 таблиц была идея написать что-то типа универсальной процедуры, кот. возвращает кучу инфы по человеку, а в зависимости от отчета использовать только нужную, т.е. вызывается процедура, а из нее в selecte выводим например только 1,3,5 параметр. Насколько я понял остается только Вариант 1 и 2, ну или в каждом отчете подключать эти зложастные 5 таблиц?

Неактивен

 

#4 28.11.2007 15:30:36

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 845

Re: Вызов функций в select?

А почему непосредственно в процедуре нельзя динамически SELECT сформировать?

Неактивен

 

#5 28.11.2007 15:46:45

Dimon
Завсегдатай
Зарегистрирован: 06.09.2007
Сообщений: 45

Re: Вызов функций в select?

1. в смысле? не понял. Есть отчеты - селекты с кучами критериев и в них надо вызывать (во многих случаех одну и туже) инфу по человеку (якобы процедурку), где формировать динамический запрос в процедурке - инфо по человеку?
2. для примера напишите составной селект в процедуре в зависимости от того есть ли входной параметр.
у нас есть вариант такой:
процедура с параметром inparam
   select * from tbl
       where (tbl.uniq = inparam or tbl.uniq is null)

Неактивен

 

#6 29.11.2007 04:15:30

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 845

Re: Вызов функций в select?

Входных параметров всегда должно быть нужное количество (иначе случится ошибка).

Динамически формировать список нужных столбцов можно двумя способами:

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?

Неактивен

 

#7 29.11.2007 08:20:32

Dimon
Завсегдатай
Зарегистрирован: 06.09.2007
Сообщений: 45

Re: Вызов функций в select?

Спасибо за подробный ответ, но я немного не то имел ввиду. В клиенте формировать динамический запрос конечно можно, но для нас немного критично формировать имеено на сервере (но это не то).
Насчет первого примера - мы это тоже в курсе, но я имел ввиду критерии уже в условии 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

Вот что хотелось бы, но процедуру нельзя вызвать понятно, есть ли какой-то обходной путь?

Неактивен

 

#8 29.11.2007 18:21:07

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Вызов функций в select?

А функция Вас не устроит?

Неактивен

 

#9 29.11.2007 19:44:53

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 845

Re: Вызов функций в select?

А нельзя ли сделать один или несколько VIEW, имеющих нужный Вам набор колонок, и их вызывать?

Неактивен

 

#10 03.12.2007 13:35:35

Dimon
Завсегдатай
Зарегистрирован: 06.09.2007
Сообщений: 45

Re: Вызов функций в select?

1. paulus: проблема функции в том, что она возвращает одно значение (или я не прав?), а нам надо несколько 'столбцов'.

2. LazY: View сделать нельзя, т.к. они оч.большие и по всем записям (а надо только из запроса-отчета, так быстрее), они работают через запись на диск, что замедляет работу.

3. Кстати в связи с View, есть еще вопрос, при создании темповой таблицы нельзя работать в соответствующих таблицах (кот. в запросе на создание тепм таблицы). Пока не разбирались может подскажете, может таблица блокируется на запись или еще что-то, исп. InnoDB?

Неактивен

 

#11 03.12.2007 13:38:14

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Вызов функций в select?

3. В Innodb реализована мультиверсиооность, поэтому таблицы не блокируются, см также тему: http://sqlinfo.ru/forum/viewtopic.php?id=276

Неактивен

 

#12 03.12.2007 14:38:58

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Вызов функций в select?

1. Что мешает написать несколько функций - по количеству столбцов?

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson