CREATE OR REPLACE FUNCTION get_next_id(obj_id_ IN VARCHAR , ext_value_ IN VARCHAR ) RETURNS VARCHAR AS $$ declare l_res VARCHAR ; l_temp VARCHAR; l_temp_ext_value VARCHAR; l_field_value VARCHAR; l_key_type VARCHAR; l_start integer; l_step integer; l_value integer; nPos integer; l_index integer; l_lead_zero_len integer; l_mask VARCHAR; l_ext_value VARCHAR; get_sys_id cursor(obj_id_ varchar) FOR SELECT KEY_TYPE, start ,STEP, VALUE ,MASK, lead_zero_len,ext_value FROM sys_id WHERE obj_id = obj_id_; BEGIN open get_sys_id(obj_id_); fetch get_sys_id INTO l_key_type,l_start,l_step,l_value,l_mask ,l_lead_zero_len,l_ext_value; close get_sys_id ; IF l_start IS NULL THEN l_start:=1; END IF; IF l_step IS NULL THEN l_step :=1; END IF; if l_key_type is null THEN SELECT sys_guid() INTO l_res; l_res := REPLACE(l_res,'-','') ; end if; /*l_key_type*/ /*1: 自增,2: UUID,3: 日期+自增,4: 年月+自增;5: 年+自增 */ IF l_key_type='1' THEN IF l_value IS NULL THEN l_value :=l_start; ELSE l_value := l_value+ l_step; END IF; IF l_lead_zero_len>0 THEN l_res :=LPAD(l_value,l_lead_zero_len,'0') ; ELSE l_res :=cast(l_value as INTEGER) ; END IF; IF l_mask IS NOT NULL THEN l_res:= REPLACE(l_mask,'{SEQ}',l_res) ; END IF; UPDATE sys_id SET VALUE=l_value WHERE obj_id = obj_id_ ; ELSIF l_key_type='3' THEN SELECT to_char(now(),'YYYYMMDD') INTO l_temp_ext_value ; IF l_temp_ext_value= l_ext_value THEN IF l_value IS NULL THEN l_value :=l_start; ELSE l_value := l_value+ l_step; END IF; ELSE l_value :=l_start; l_ext_value :=l_temp_ext_value; END IF; IF l_lead_zero_len>0 THEN l_temp :=LPAD(l_value,l_lead_zero_len,'0') ; ELSE l_temp :=cast(l_value as INTEGER); END IF; IF l_mask IS NOT NULL THEN l_res := REPLACE(l_mask,'{DATE}',l_ext_value) ; l_res := REPLACE(l_res,'{SEQ}',l_temp) ; ELSE l_res := l_ext_value||'-'||l_temp ; END IF; UPDATE sys_id SET VALUE=l_value, ext_value=l_ext_value WHERE obj_id = obj_id_ ; ELSIF l_key_type='4' THEN SELECT to_char(now(),'YYYYMM') INTO l_temp_ext_value ; IF l_temp_ext_value= l_ext_value THEN IF l_value IS NULL THEN l_value :=l_start; ELSE l_value := l_value+ l_step; END IF; ELSE l_value :=l_start; l_ext_value :=l_temp_ext_value; END IF; IF l_lead_zero_len>0 THEN l_temp :=LPAD(l_value,l_lead_zero_len,'0') ; ELSE l_temp :=cast(l_value as INTEGER); END IF; IF l_mask IS NOT NULL THEN l_res := REPLACE(l_mask,'{DATE}',l_ext_value) ; l_res := REPLACE(l_res,'{SEQ}',l_temp) ; ELSE l_res := l_ext_value||'-'||l_temp ; END IF; UPDATE sys_id SET VALUE=l_value, ext_value=l_ext_value WHERE obj_id = obj_id_ ; ELSIF l_key_type='5' THEN SELECT to_char(now(),'YYYY') INTO l_temp_ext_value ; IF l_temp_ext_value= l_ext_value THEN IF l_value IS NULL THEN l_value :=l_start; ELSE l_value := l_value+ l_step; END IF; ELSE l_value :=l_start; l_ext_value :=l_temp_ext_value; END IF; IF l_lead_zero_len>0 THEN l_temp :=LPAD(l_value,l_lead_zero_len,'0') ; ELSE l_temp :=cast(l_value as INTEGER); END IF; IF l_mask IS NOT NULL THEN l_res := REPLACE(l_mask,'{DATE}',l_ext_value) ; l_res := REPLACE(l_res,'{SEQ}',l_temp) ; ELSE l_res := l_ext_value||'-'||l_temp ; END IF; UPDATE sys_id SET VALUE=l_value, ext_value=l_ext_value WHERE obj_id = obj_id_ ; ELSE --l_key_type='2' THEN SELECT sys_guid() INTO l_res ; l_res := REPLACE(l_res,'-','') ; END IF; IF ext_value_ is not null THEN l_index:=1; l_temp:=ext_value_ ; WHILE position(';' in l_temp)>0 loop nPos:=position(';' in l_temp); l_field_value:=substring(l_temp from 1 for nPos-1); l_temp:=substring(l_temp from nPos+1 ); l_res := REPLACE(l_res,'{'||cast(l_index as INTEGER)||'}',l_field_value) ; l_index:=l_index+1; END loop; l_res := REPLACE(l_res, '{'||cast(l_index as INTEGER)||'}' ,l_temp) ; END IF; --commit; RETURN l_res; END ; $$ language plpgsql; CREATE or REPLACE FUNCTION sys_guid() RETURNS varchar AS $$ DECLARE v_seed_value varchar(32); BEGIN select md5( inet_client_addr()::varchar || timeofday() || inet_server_addr()::varchar || to_hex(inet_client_port()) ) into v_seed_value; return (substr(v_seed_value,1,8) || substr(v_seed_value,9,4) || substr(v_seed_value,13,4) || substr(v_seed_value,17,4) || substr(v_seed_value,21,12)); END; $$ LANGUAGE 'plpgsql' ; CREATE OR REPLACE FUNCTION TREPS_CONCAT(str1 VARCHAR , str2 VARCHAR , str3 VARCHAR ) RETURNS VARCHAR AS $$ BEGIN RETURN str1||str2||str3; END ; $$ language plpgsql; CREATE OR REPLACE FUNCTION treps_date_to_char(date1 timestamp , strFormat VARCHAR ) RETURNS VARCHAR as $$ BEGIN RETURN to_char(date1,strFormat) ; END ; $$ language plpgsql; CREATE OR REPLACE FUNCTION treps_instr(str varchar, substr1 varchar,flag integer default 0) returns integer as $$ declare l_res integer; posSep integer; posSepSub integer; strTemp varchar; BEGIN if (substr1 is null or substr1='') THEN return 0; end if; if (str is null or str='') THEN if (flag=1) then return 1; ELSE return 0; end if; end if; posSep:=position( ',' in str ); posSepSub:=position( ',' in substr1 ) ; if (posSep>0) OR (posSepSub>0) then if posSepSub>0 then l_res:=0; strTemp:=substr1; while (posSepSub>0)and(char_length(strTemp)>0) loop if position( ','||substring(strTemp from 1 for posSepSub-1)||',' in ','||str||',')>0 then return 1; end if; strTemp:= substring(strTemp from posSepSub+1 ); posSepSub:= position( ',' in strTemp ); end loop; if char_length(strTemp)>0 then if position( ','||strTemp||',' in ','||str||',' )>0 then return 1; end if; end if; else l_res:= position(','||substr1||',' in ','||str||',' ); end if; else l_res:= position(substr1 in str ); end if; RETURN l_res; END ; $$ language plpgsql; CREATE OR REPLACE FUNCTION treps_to_date(str1 VARCHAR , strFormat VARCHAR ) RETURNS date as $$ BEGIN RETURN to_date(str1,strFormat) ; END ; $$ language plpgsql; CREATE OR REPLACE FUNCTION TREPS_TO_INT(TEMP_ in varchar ) RETURNS integer AS $$ BEGIN RETURN to_number(TEMP_,'9999999999'); END ; $$ language plpgsql;