хранимая процедура mysql - выберите ... для обновления - PullRequest
0 голосов
/ 22 июля 2011

Я использую «выбрать ... для обновления» в хранимой процедуре. но когда хранимая процедура завершается, она возвращает результат из "select ... for update", который я сделал в начале. Есть ли способ заставить его блокировать строки, не возвращая их?

код хранимой процедуры:

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_save`(
in param_cod_emp char(5),
in param_cod_tab char(5),
in param_des_tab varchar(45),
in param_flg_new char(1))
BEGIN

declare var_cod_tab char(5);

start transaction;

select *
from tabla
where cod_emp=param_cod_emp
for update;

if(param_flg_new='0') then

set var_cod_tab=
(select max(cod_tab)+1
from tabla
where cod_emp=param_cod_emp);

insert into tabla(
cod_emp,
cod_tab,
des_tab)
values(
param_cod_emp,
var_cod_tab,
param_des_tab);

else

udpate tabla where
des_tab=param_des_tab
where cod_emp=param_cod_emp
and cod_tab=param_cod_tab;

end if;

commit;

END

этот код хороший способ сделать столбец char похожим на auto_increment? Большое спасибо за ваше время.

Ответы [ 2 ]

1 голос
/ 22 июля 2011

Вы можете LOCK TABLE (таблицы MyISAM) или BEGIN TRANSACTION или каков синтаксис (для обработчиков таблиц с поддержкой транзакций, таких как InnoDB или Maria).

Обновление: О, теперь я вижу, что вы выполняете START TRANSACTION,Ну, тогда:

Хранимые процедуры MySQL возвращают результат последнего выполненного SELECT.Поэтому, если вы хотите вернуть другой набор результатов, просто сделайте еще один SELECT.

0 голосов
/ 22 июля 2011

если вы используете триггер и последовательность для увеличения и вставки идентификатора, вам никогда не придется выбирать max () из таблицы, из которой вы вставляете или обновляете, и, вероятно, не возникнет этой проблемы, я никогда не использовал выбор для обновления, но ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...