|

楼主 |
发表于 2008-2-18 18:09:04
|
显示全部楼层
oracle存储过程是
create or replace procedure getidserial(i_type varchar2,i_prefix varchar2,i_len int,o_serial out varchar2) is
idno number;
i int;
fs varchar2(120);
fno varchar2(120);
begin
fs := '';
FOR I IN 1..i_len LOOP
fs := fs||'0';
end loop;
select count(*) into i from t_sys_autoid where id_type=i_type and id_prefix=i_prefix;
if i=0 then
insert into t_sys_autoid (id_type,id_prefix,id_value,AccessTime) values (i_type,i_prefix,2,sysdate);
select i_prefix||ltrim(to_char(1,fs)) into fno from dual;
commit;
else
--select加锁
select id_value,i_prefix||ltrim(to_char(id_value,fs)) into idno,fno
from t_sys_autoid where id_type=i_type and id_prefix=i_prefix for update;
--号表更新
update t_sys_autoid set id_value = id_value + 1,AccessTime=sysdate where id_type=i_type and id_prefix=i_prefix;
commit;
end if;
--返回号
o_serial :=fno;
end;
程序调用的写法是:
with TStoredProc.Create(nil) do
try
ConnectionString := connstr;
StoredProcName := 'GETIDSERIAL';
Params.Clear;
Params.CreateParam(TFieldType.ftString, 'i_type', TParamType.ptInput);
Params.CreateParam(TFieldType.ftString, 'i_prefix', TParamType.ptInput);
Params.CreateParam(TFieldType.ftInteger, 'i_len', TParamType.ptInput);
Params.CreateParam(TFieldType.ftString, 'o_serial', TParamType.ptOutput);
Params.ParamByName('i_type').AsString := AIDType;
Params.ParamByName('i_prefix').AsString := lStr1+lStr2;
Params.ParamByName('i_len').AsInteger := lLen;
Execute;
//修改linux下文号无法显示的bug by linhai 080215
//Result := Params.ParamByName('o_serial').AsString + lEndStr;
lStr2 := lStr1 + lStr2 + Params.ParamByName('o_serial').AsString + lEndStr;
Result := lStr2;
finally
Free;
end; |
|