MySql, .NET, хранимые процедуры, совместно использующие текущую дату и время с вызывающим клиентом

0

Я пишу хранимую процедуру для обновления таблицы:

UPDATE st SET somedate = NOW();

Клиент SP должен знать точную дату и время, сгенерированные функцией NOW.

Есть два варианта:

1) клиент передает входной параметр (называемый _now) в SP, дающий ему текущую дату и время

UPDATE st SET somedate = _now;

2) SP возвращает обратно выход NOW клиенту в параметр out

UPDATE st SET somedate = NOW();
SELECT somedate FROM st INTO _now;

Как вы думаете, лучший вариант? Возможны ли другие варианты?

Теги:
stored-procedures

3 ответа

1
  • varnow = now()
  • UPDATE st set somedate = varnow
  • return varnow
  • 0
    это второй вариант. почему он лучше первого?
  • 0
    @vulkanino, потому что он теперь используется () только в одном месте.
Показать ещё 2 комментария
0

я сделал бы что-то вроде этого:

drop table if exists users;
create table users
(
user_id int unsigned not null auto_increment primary key,
username varchar(32) unique not null,
created_date datetime not null
)
engine=innodb;


delimiter ;

drop procedure if exists insert_user;

delimiter #

create procedure insert_user
(
in uname varchar(32)
)
proc_main:begin

declare id int unsigned default null;
declare created datetime default null;

set created = now();

insert into users (username, created_date) values (uname, created);

set id = last_insert_id();

-- use id elsewhere maybe...

select id as user_id, created as created_date;

end proc_main #


delimiter ;

call insert_user('f00');
call insert_user('bar');

select * from users;
0

Я подозреваю, что оба подхода ошибочны.

клиент SP должен знать точную дату и время

Почему? Я подозреваю, что вы действительно мужчины, что клиент должен иметь возможность идентифицировать записи, затронутые транзакцией, - но использование временной метки для этого не будет точным. И это не просто транзакция, охватывающая более 1 секунды. Потенциально две такие операции могут произойти за ту же секунду.

Если у вас есть набор записей, которые вам нужно идентифицировать как принадлежащие к какой-либо группе, тогда это должно быть выражено в схеме - метка времени самой транзакции, очевидно, не надежна, даже если предположить, что у вас никогда не будет дополнительных обновлений на таблицу.

Добавьте еще один столбец или другую таблицу и создайте суррогатный ключ для описания транзакции.

С.

  • 0
    Я хочу сообщить клиенту, если он имеет точные (обновленные) данные, но не просматривает все таблицы в моей модели. Поэтому я сравниваю поле last_updated в простой таблице с переменным LastUpdated в моем клиентском приложении. Если они различаются, мне приходится перезагружать множество таблиц, но если этого не происходит, я в порядке.
  • 0
    Это сработает, только если проверка выполняется между каждой операцией обновления - можете ли вы гарантировать это? OTOH, если вы использовали инкрементный идентификатор транзакции, было бы легко определить, когда данные не были синхронизированы, а также какие данные отсутствуют - так работает TCP (и любой другой сетевой протокол, связанный с потоком). Я не думаю, что вы изобрели лучшее решение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню