PDA

Показать полную графическую версию : Помогите с простенькой процедурой/функцией


GregRUS
21-07-2011, 00:38
Помогите с простенькой процедурой с параметрами, которая позволит создавать в таблице значения, а при их существовании - заменять.
Таблица в базе данных - 'users'
Значений всего там три - 'name' 'work' и 'income'
Процедура естественно будет вызываться с параметрами с этими значениями.
При вызове - поиск должен производиться по первому полю ('name').

Максимум что смог сделать - это создание в полях:

DELIMITER $$

DROP PROCEDURE IF EXISTS `db`.`test_procedure` $$
CREATE PROCEDURE `db`.`test_procedure` (IN param1 VARCHAR(255), IN param2 VARCHAR(255), IN param3 VARCHAR(255))
BEGIN
INSERT INTO `db`.`users` (
`Name` ,
`Work` ,
`Income`
)
VALUES (
param1, param2, param3
);
END $$

DELIMITER ;

Остается только добавить проверку на присутствие поля 'Name' и дальнейшее действие - UPDATE либо INSERT - тут не очень понятно.
Также не разобрался с функцией чтения из таблицы например при вызове функции чтения с имеющимся параметром 'name' - вывод соответствующих Name значений полей 'Work' и 'Income'?
Надеюсь на вашу помощь.

Delirium
21-07-2011, 09:56
Также не разобрался с функцией чтения из таблицы например при вызове функции чтения с имеющимся параметром 'name' - вывод соответствующих Name значений полей 'Work' и 'Income'? »
select * from users where name='твой текст'

По поводу обновления или изменения. Можно проверять на клиенте, есть ли требуемая запись, или же написать процедуру, которая сначала будет делать нечто подобному:

declare @counter int
set @counter = (select count(name) from users where name='твой текст')
if @counter >0 --Если есть такая запись, значит обновляем
begin
update users set work = 'твой текст' where name='твой текст'
end
if @counter =0 --записей нет, вставляем новую строку
begin
insert into users(name, work, income) values ('текст','текст','текст')
end


Приведенный код - заготовка для дальнейших действий. Но суть, думаю, понятна.

Hangsman
21-07-2011, 11:43
Может есть резон попробывать структуры запроса
INSERT INTO table (столбец 1, столбец2) VALUES (значение 1, значение2)
ON DUPLICATE KEY UPDATE что сделать;

Или оператор REPLACE, отличаетса от INSERT тем, что если есть запись старая удаляетса и новая создаетса

GregRUS
21-07-2011, 15:01
Спасибо за ответы!
Ис пользовал ON DUPLICATE KEY UPDATE
В таблице полю 'name' присвоил UNIQUE - все работает.

Осталась только функция запроса:
Вызов функции с параметром 'name', по которому происходит поиск по таблице, и возврат остальных значений.

Delirium
21-07-2011, 15:51
Осталась только функция запроса: »
Я же описал выше метод решения проблемы. Или есть вопросы?

GregRUS
21-07-2011, 16:36
Как именно задать входящую переменную и исходящие?
Синтаксис MySQL иногда повергает меня в ужас.. особенно в первые дни знакомства :)

DELIMITER $$

DROP FUNCTION IF EXISTS `db`.`getvariables` $$
CREATE FUNCTION `db`.`getvariables` (IN param1 VARCHAR(255)) RETURNS VARCHAR // Тут не уверен во входящем параметре и типе возврата
BEGIN
set @fff=select * from users where name=param1
return @fff;
END $$

DELIMITER ;

В таком виде - не хочет.

GregRUS
24-07-2011, 23:43
До сих пор не разобрался...
Функцию вообще можно вызывать с параметром?

Delirium
25-07-2011, 02:11
set @fff=select * from users where name=param1 »
select * from users where name=param1
этого достаточно. Присваивание не требуется.

Для ознакомления с синтаксисом:
http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html
http://www.devshed.com/c/a/MySQL/Examining-MySQL-50/3/




© OSzone.net 2001-2012