Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > динамический SQL: возможно ли реализовать в ХП?


Автор: posdnyaa 23.1.2008, 01:06
Здравствуйте. 
В MySQL Query Browser (версия сервера mySql 5.0.18-nt) создаю хранимую процедуру, которая выбирает из таблицы все столбцы и осуществляет сортировку по переданному во входном параметре имени столбца
Код

CREATE PROCEDURE `SelectAllCustomersOrderBy` (IN pOrdBy VARCHAR(100))
BEGIN
  Select * FROM Customers ORDER BY pOrdBy;
END $$

Так вот приведенный пример НЕ РАБОТАЕТ. Если вместо параметра задать явно  имя столбца 
Код
…..
  Select * FROM Customers ORDER BY Name;
…..

То процедура работает.
Подскажите пожалуйста, можно ли и (если да) как осуществлять сортировку в зависимости от входного параметра?
И сюда же: можно ли во входном параметре передать, а потом использовать, имя таблицы.
Например, если мне надо использовать в хран. процедуре запрос 
Код
  Select * FROM SomeTable;
, то можно ли во входном параметре передать имя таблицы и использовать его в запросе.
Спасибо.

Автор: skyboy 23.1.2008, 01:25
если речь не о функции/триггере, то можно воспользоваться http://dev.mysql.com/doc/refman/5.0/en/sqlps.html

Автор: sTa1kEr 23.1.2008, 14:04
Цитата(posdnyaa @  23.1.2008,  02:06 Найти цитируемый пост)
И сюда же: можно ли во входном параметре передать, а потом использовать, имя таблицы.

Никак нельзя.

Цитата(posdnyaa @  23.1.2008,  02:06 Найти цитируемый пост)
Подскажите пожалуйста, можно ли и (если да) как осуществлять сортировку в зависимости от входного параметра?

Динамически нельзя. Можно только если перечислить все возможные варианты запросов с сортировкой.
Код

CREATE PROCEDURE `SelectAllCustomersOrderBy` (IN pOrdBy VARCHAR(100))
BEGIN
   CASE pOrdBy
      WHEN 'column1' THEN Select * FROM Customers ORDER BY `column1`;
      WHEN 'column2' THEN Select * FROM Customers ORDER BY `column2`;
      WHEN 'column3' THEN Select * FROM Customers ORDER BY `column3`;
   END CASE;
END $$


Цитата(skyboy @  23.1.2008,  02:25 Найти цитируемый пост)
если речь не о функции/триггере, то можно воспользоваться prepared statesments 

К prepared statesments применяется тоже правило. Можно биндить только строковые константы! Динамически менять колонки, операторы или ключевые слова - нельзя.

Автор: vi_k 24.1.2008, 04:08
Где-то я уже встречал этот вопрос smile Да, лучше здесь задавать, и красивше, и ребята пограмотнее ;)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)