Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Помогите с простенькой процедурой/функцией (http://forum.oszone.net/showthread.php?t=211580)

GregRUS 21-07-2011 00:38 1716758

Помогите с простенькой процедурой/функцией
 
Помогите с простенькой процедурой с параметрами, которая позволит создавать в таблице значения, а при их существовании - заменять.
Таблица в базе данных - '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 1716877

Цитата:

Цитата GregRUS
Также не разобрался с функцией чтения из таблицы например при вызове функции чтения с имеющимся параметром '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 1716977

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

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

GregRUS 21-07-2011 15:01 1717180

Спасибо за ответы!
Ис пользовал ON DUPLICATE KEY UPDATE
В таблице полю 'name' присвоил UNIQUE - все работает.

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

Delirium 21-07-2011 15:51 1717213

Цитата:

Цитата GregRUS
Осталась только функция запроса: »

Я же описал выше метод решения проблемы. Или есть вопросы?

GregRUS 21-07-2011 16:36 1717247

Как именно задать входящую переменную и исходящие?
Синтаксис 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 1719150

До сих пор не разобрался...
Функцию вообще можно вызывать с параметром?

Delirium 25-07-2011 02:11 1719188

Цитата:

Цитата GregRUS
set @fff=select * from users where name=param1 »

select * from users where name=param1
этого достаточно. Присваивание не требуется.

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


Время: 02:13.

Время: 02:13.
© OSzone.net 2001-