|
|
|
| Здесь один из примеров написания запроса с использованием пользовательских переменных и, в частности, оператора if. (Взято из инета,и немного переделано. Работает)
В интернете только в двух местах нашёл такую технику с использвоанием if для mysql, и больше попадались transact user-defined variables для ms-sql. Нигде не объясняется подробно про использование такого синтаксиса с if.
SET @maxId:= 0;
update a_table SET a_column= (if (@maxId >5 , @maxId:= 1 , @maxId:= @maxId + 1 ) )
Вопрос:
Как переписать запрос так, чтобы после оператора "if" следовал не 1, а несколько операторов в {statements}, удовлетворяющих выражению if (@maxId >5) , и затем выдать желаемое значение для присвоения c_num ?
То есть в примере выше следует один оператор @maxId:= 1 в случае, если @maxId >5,
и далее, каким-то образом, (видимо по умолчанию?) это значение @maxId сразу передаётся для апдейта в c_num.
Я хочу ввести новый оператор, следующий за @maxId:= 1 (для изменения и последующего усложнения запроса), скажем @n:=2. Но как их перечислить в statements и как выдать желаемую переменную в c_num неясно.
Может быть, у кого то есть идеи?
Заранее спасибо. | |
|
|
|
|
|
|
|
для: cosmix
(31.01.2007 в 05:24)
| | Дело в том, что здесь используется функция IF(), которая в общем эквивалентна C-оператору X ? Y : Z, он не позволяет использовать множество операторов в аргументе. Помимо фукнции имеется оператор IF, который применяется в хранимых процедурах - в нём можно использовать множество операторов. Если вы хотите использовать функцию if() со множеством операторов - вам необходимо оформить их в виде хранимой функции. | |
|
|
|
|
|
|
|
для: cheops
(31.01.2007 в 13:11)
| | Ага, большое спасибо за подсказку.
Да, я понимаю это как краткая запись в asp, php и ряде других языков вроде
<?= $x==$y ? stat_1 : stat_2 ?>
Тогда краткий синтаксис отпадает.
Прочитал 2 статьи по хранимым процедурам в mysql.
Нет возможности пока проверить работу - установлю mysql 5 на днях, но, по-моему, очень полезная штука.
Подозреваю что в случае выше выражение должно выглядеть следующим образом:
SET @maxId:= 0;
CREATE PROCEDURE a_proc (INOUT p INT)
BEGIN
IF ( p >5 )
THEN
SET p:= 1;
SET @n:=2;
ELSE
SET p:= p+ 1
END IF;
END|
update a_table SET a_column= @maxId := CALL a_proc(@maxId) ;
Не знаком с процедуральным программированием, поэтому сомневаюсь в записи
SET a_column= @maxId := CALL a_proc(@maxId)
потому что неясно может ли вызов процедуры возвращать вообще что-либо. Скорее всего нет, но тогда где прописывать вызов процедуры?
Нашёл похожее, отсюда
http://docs.openlinksw.com/virtuoso/PLREF.html ( из sql procedure language guide)
где видно что вызов процедуры всё же возвращает значение:
CREATE PROCEDURE COMPUTED_CALL (IN Q INTEGER)
{
DECLARE FN VARCHAR;
FN := 'F';
--- CALL FUNCTION FF WITH ARGUMENT 11.
R := CALL (CONCATENATE (FN, 'F')) (11);
}
Но так ли это в MySQL неясно, другими словами надо понять как прописать вызов процедуры в контексте update | |
|
|
|
|
|
|
|
для: cosmix
(31.01.2007 в 16:21)
| | >update a_table SET a_column= @maxId := CALL a_proc(@maxId) ;
Нет, тут лучше будет воспользоваться хранимыми функциями (они вызываются без CALL) | |
|
|
|
|
|
|
|
для: cheops
(31.01.2007 в 18:46)
| | ясненько. Да нашёл. Почти то же самое, но, в частности, возвращает, как и классически пологается функции, значение. Ок, попробую, установив 5ю версию.
Спасибо! | |
|
|
|