56,803
社区成员




Create Table tbSequence(Id Int Unsigned Not Null Auto_Increment Primary Key, SequenceName Varchar(50) Not Null, SequenceValue Bigint Not Null);
Delimiter ;
Drop Function If Exists `fnNextSequence`;
Delimiter ;;
Create Function `fnNextSequence`(
p_SequenceName Varchar(50)
) Returns Bigint
Begin
Declare v_Result Bigint Default Null;
-- Lock Tables tbSequence Write;
-- Set Autocommit = 0;
-- Start Transaction;
Select SequenceValue Into v_Result From tbSequence Where SequenceName = p_SequenceName;
If v_Result Is Not Null Then
Set v_Result = v_Result + 1;
Update tbSequence Set SequenceValue = v_Result Where SequenceName = p_SequenceName;
Else
Set v_Result = 1;
Insert Into tbSequence(SequenceName, SequenceValue) Values(p_SequenceName, v_Result);
End If;
-- Unlock Tables tbSequence;
-- Commit;
Return v_Result;
End;;
Delimiter ;
Drop Function If Exists `fnCurrentSequence`;
Delimiter ;;
Create Function `fnCurrentSequence` (
p_SequenceName Varchar(50)
) Returns Bigint
Begin
Declare v_Result Bigint Default Null;
-- Lock Tables tbSequence Write;
-- Set AutoCommit = 0;
-- Start Transaction;
Select SequenceValue Into v_Result From tbSequence Where SequenceName = p_SequenceName;
-- Unlock Tables tbSequence;
-- Commit;
Return v_Result;
End;;
Delimiter ;
Drop Function If Exists `fnNextSequence`;
Delimiter ;;
Create Function `fnNextSequence`(
p_SequenceName Varchar(50)
) Returns Bigint
Begin
Declare v_Result Bigint Default Null;
Declare v_MaxValue Bigint Default Null;
Declare v_Lock Int Unsigned;
Select Get_Lock(p_SequenceName, 1) Into v_Lock;
Select `SequenceValue`, `MaxValue` Into v_Result, v_MaxValue From tbSequence Where SequenceName = p_SequenceName;
If v_Result Is Not Null Then
Set v_Result = v_Result + 1;
if (v_MaxValue Is Not Null) And (v_Result > v_MaxValue) THEN
Set v_Result = 1;
END IF;
Update tbSequence Set SequenceValue = v_Result Where SequenceName = p_SequenceName;
Else
Set v_Result = 1;
Insert Into tbSequence(SequenceName, SequenceValue) Values(p_SequenceName, v_Result);
End If;
Select RELEASE_LOCK(p_SequenceName) Into v_Lock;
Return v_Result;
End;;
delimiter ;
drop function if exists `fnNextSequence1`;
delimiter ;;
create function `fnNextSequence1` (
p_name varchar(50)
) returns bigint
begin
begin work;
declare v_result bigint;
if exists(select * from tbSequence where SequenceName = p_name) then
select SequenceValue +1 into v_result from tbSequence where SequenceName = p_name;
update tbSequence set SequenceValue = SequenceValue + 1 where SequenceName = p_name;
else
set v_result = 1;
insert into tbSequence(SequenceName, SequenceValue) Values(p_name, 1);
end if;
return v_result;
end work;
end;;
报错:
[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ';
declare v_result bigint;
if exists(select * from tbSequence where Sequen' at line 5