ims_postgresql_func.sql 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. CREATE OR REPLACE FUNCTION get_next_id(obj_id_ IN VARCHAR ,
  2. ext_value_ IN VARCHAR ) RETURNS VARCHAR AS $$
  3. declare
  4. l_res VARCHAR ;
  5. l_temp VARCHAR;
  6. l_temp_ext_value VARCHAR;
  7. l_field_value VARCHAR;
  8. l_key_type VARCHAR;
  9. l_start integer;
  10. l_step integer;
  11. l_value integer;
  12. nPos integer;
  13. l_index integer;
  14. l_lead_zero_len integer;
  15. l_mask VARCHAR;
  16. l_ext_value VARCHAR;
  17. get_sys_id cursor(obj_id_ varchar) FOR
  18. SELECT KEY_TYPE, start ,STEP, VALUE ,MASK, lead_zero_len,ext_value
  19. FROM sys_id WHERE obj_id = obj_id_;
  20. BEGIN
  21. open get_sys_id(obj_id_);
  22. fetch get_sys_id INTO l_key_type,l_start,l_step,l_value,l_mask ,l_lead_zero_len,l_ext_value;
  23. close get_sys_id ;
  24. IF l_start IS NULL THEN
  25. l_start:=1;
  26. END IF;
  27. IF l_step IS NULL THEN
  28. l_step :=1;
  29. END IF;
  30. if l_key_type is null THEN
  31. SELECT sys_guid() INTO l_res;
  32. l_res := REPLACE(l_res,'-','') ;
  33. end if;
  34. /*l_key_type*/
  35. /*1: 自增,2: UUID,3: 日期+自增,4: 年月+自增;5: 年+自增 */
  36. IF l_key_type='1' THEN
  37. IF l_value IS NULL THEN
  38. l_value :=l_start;
  39. ELSE
  40. l_value := l_value+ l_step;
  41. END IF;
  42. IF l_lead_zero_len>0 THEN
  43. l_res :=LPAD(l_value,l_lead_zero_len,'0') ;
  44. ELSE
  45. l_res :=cast(l_value as INTEGER) ;
  46. END IF;
  47. IF l_mask IS NOT NULL THEN
  48. l_res:= REPLACE(l_mask,'{SEQ}',l_res) ;
  49. END IF;
  50. UPDATE sys_id
  51. SET VALUE=l_value
  52. WHERE obj_id = obj_id_ ;
  53. ELSIF l_key_type='3' THEN
  54. SELECT to_char(now(),'YYYYMMDD') INTO l_temp_ext_value ;
  55. IF l_temp_ext_value= l_ext_value THEN
  56. IF l_value IS NULL THEN
  57. l_value :=l_start;
  58. ELSE
  59. l_value := l_value+ l_step;
  60. END IF;
  61. ELSE
  62. l_value :=l_start;
  63. l_ext_value :=l_temp_ext_value;
  64. END IF;
  65. IF l_lead_zero_len>0 THEN
  66. l_temp :=LPAD(l_value,l_lead_zero_len,'0') ;
  67. ELSE
  68. l_temp :=cast(l_value as INTEGER);
  69. END IF;
  70. IF l_mask IS NOT NULL THEN
  71. l_res := REPLACE(l_mask,'{DATE}',l_ext_value) ;
  72. l_res := REPLACE(l_res,'{SEQ}',l_temp) ;
  73. ELSE
  74. l_res := l_ext_value||'-'||l_temp ;
  75. END IF;
  76. UPDATE sys_id
  77. SET VALUE=l_value,
  78. ext_value=l_ext_value
  79. WHERE obj_id = obj_id_ ;
  80. ELSIF l_key_type='4' THEN
  81. SELECT to_char(now(),'YYYYMM') INTO l_temp_ext_value ;
  82. IF l_temp_ext_value= l_ext_value THEN
  83. IF l_value IS NULL THEN
  84. l_value :=l_start;
  85. ELSE
  86. l_value := l_value+ l_step;
  87. END IF;
  88. ELSE
  89. l_value :=l_start;
  90. l_ext_value :=l_temp_ext_value;
  91. END IF;
  92. IF l_lead_zero_len>0 THEN
  93. l_temp :=LPAD(l_value,l_lead_zero_len,'0') ;
  94. ELSE
  95. l_temp :=cast(l_value as INTEGER);
  96. END IF;
  97. IF l_mask IS NOT NULL THEN
  98. l_res := REPLACE(l_mask,'{DATE}',l_ext_value) ;
  99. l_res := REPLACE(l_res,'{SEQ}',l_temp) ;
  100. ELSE
  101. l_res := l_ext_value||'-'||l_temp ;
  102. END IF;
  103. UPDATE sys_id
  104. SET VALUE=l_value,
  105. ext_value=l_ext_value
  106. WHERE obj_id = obj_id_ ;
  107. ELSIF l_key_type='5' THEN
  108. SELECT to_char(now(),'YYYY') INTO l_temp_ext_value ;
  109. IF l_temp_ext_value= l_ext_value THEN
  110. IF l_value IS NULL THEN
  111. l_value :=l_start;
  112. ELSE
  113. l_value := l_value+ l_step;
  114. END IF;
  115. ELSE
  116. l_value :=l_start;
  117. l_ext_value :=l_temp_ext_value;
  118. END IF;
  119. IF l_lead_zero_len>0 THEN
  120. l_temp :=LPAD(l_value,l_lead_zero_len,'0') ;
  121. ELSE
  122. l_temp :=cast(l_value as INTEGER);
  123. END IF;
  124. IF l_mask IS NOT NULL THEN
  125. l_res := REPLACE(l_mask,'{DATE}',l_ext_value) ;
  126. l_res := REPLACE(l_res,'{SEQ}',l_temp) ;
  127. ELSE
  128. l_res := l_ext_value||'-'||l_temp ;
  129. END IF;
  130. UPDATE sys_id
  131. SET VALUE=l_value,
  132. ext_value=l_ext_value
  133. WHERE obj_id = obj_id_ ;
  134. ELSE --l_key_type='2' THEN
  135. SELECT sys_guid() INTO l_res ;
  136. l_res := REPLACE(l_res,'-','') ;
  137. END IF;
  138. IF ext_value_ is not null THEN
  139. l_index:=1;
  140. l_temp:=ext_value_ ;
  141. WHILE position(';' in l_temp)>0 loop
  142. nPos:=position(';' in l_temp);
  143. l_field_value:=substring(l_temp from 1 for nPos-1);
  144. l_temp:=substring(l_temp from nPos+1 );
  145. l_res := REPLACE(l_res,'{'||cast(l_index as INTEGER)||'}',l_field_value) ;
  146. l_index:=l_index+1;
  147. END loop;
  148. l_res := REPLACE(l_res, '{'||cast(l_index as INTEGER)||'}' ,l_temp) ;
  149. END IF;
  150. --commit;
  151. RETURN l_res;
  152. END ;
  153. $$ language plpgsql;
  154. CREATE or REPLACE FUNCTION sys_guid()
  155. RETURNS varchar AS
  156. $$
  157. DECLARE
  158. v_seed_value varchar(32);
  159. BEGIN
  160. select
  161. md5(
  162. inet_client_addr()::varchar ||
  163. timeofday() ||
  164. inet_server_addr()::varchar ||
  165. to_hex(inet_client_port())
  166. )
  167. into v_seed_value;
  168. return (substr(v_seed_value,1,8) ||
  169. substr(v_seed_value,9,4) ||
  170. substr(v_seed_value,13,4) ||
  171. substr(v_seed_value,17,4) ||
  172. substr(v_seed_value,21,12));
  173. END;
  174. $$
  175. LANGUAGE 'plpgsql' ;
  176. CREATE OR REPLACE FUNCTION TREPS_CONCAT(str1 VARCHAR , str2 VARCHAR , str3 VARCHAR ) RETURNS VARCHAR AS $$
  177. BEGIN
  178. RETURN str1||str2||str3;
  179. END ;
  180. $$ language plpgsql;
  181. CREATE OR REPLACE FUNCTION treps_date_to_char(date1 timestamp , strFormat VARCHAR ) RETURNS VARCHAR as $$
  182. BEGIN
  183. RETURN to_char(date1,strFormat) ;
  184. END ;
  185. $$ language plpgsql;
  186. CREATE OR REPLACE FUNCTION treps_instr(str varchar, substr1 varchar,flag integer default 0) returns integer as $$
  187. declare
  188. l_res integer;
  189. posSep integer;
  190. posSepSub integer;
  191. strTemp varchar;
  192. BEGIN
  193. if (substr1 is null or substr1='') THEN
  194. return 0;
  195. end if;
  196. if (str is null or str='') THEN
  197. if (flag=1) then
  198. return 1;
  199. ELSE
  200. return 0;
  201. end if;
  202. end if;
  203. posSep:=position( ',' in str );
  204. posSepSub:=position( ',' in substr1 ) ;
  205. if (posSep>0) OR (posSepSub>0) then
  206. if posSepSub>0 then
  207. l_res:=0;
  208. strTemp:=substr1;
  209. while (posSepSub>0)and(char_length(strTemp)>0) loop
  210. if position( ','||substring(strTemp from 1 for posSepSub-1)||',' in ','||str||',')>0 then
  211. return 1;
  212. end if;
  213. strTemp:= substring(strTemp from posSepSub+1 );
  214. posSepSub:= position( ',' in strTemp );
  215. end loop;
  216. if char_length(strTemp)>0 then
  217. if position( ','||strTemp||',' in ','||str||',' )>0 then
  218. return 1;
  219. end if;
  220. end if;
  221. else
  222. l_res:= position(','||substr1||',' in ','||str||',' );
  223. end if;
  224. else
  225. l_res:= position(substr1 in str );
  226. end if;
  227. RETURN l_res;
  228. END ;
  229. $$ language plpgsql;
  230. CREATE OR REPLACE FUNCTION treps_to_date(str1 VARCHAR , strFormat VARCHAR ) RETURNS date as $$
  231. BEGIN
  232. RETURN to_date(str1,strFormat) ;
  233. END ;
  234. $$ language plpgsql;
  235. CREATE OR REPLACE FUNCTION TREPS_TO_INT(TEMP_ in varchar ) RETURNS integer AS $$
  236. BEGIN
  237. RETURN to_number(TEMP_,'9999999999');
  238. END ;
  239. $$ language plpgsql;