由于开发需要,想实现一些提示信息的通用,比如,提示信息内容:“XXX的值YYY不正确,请检查并重新输入!”,那么,通用的信息内容就应该为:“{0}的值{1}不正确,请检查并重新输入!”。但这个“{0}”和"{1}"怎么替换掉呢?在.net中,字符串有String.Format函数,这样我们就可以很容易地去根据不同的内容,替换成不一样的内容,但Oracle里面还没有样的函数(据个人所知,不知道有没有孤漏寡闻!),但又想用,所以就只能自己写了。
想了想,有问题啊,且听我道来:
信息内容中有多个参数,并且都是用花括号中带数字来表示,如{0},{1},{2},那么,这些参数最好能用数组来表示,但Oracle PL/SQL中有数组吗?都怪自己平时不努力,书到用时方恨少啊。在网上百谷了一下,Oralce里面没有现成的数据类型,只有通过自定义数组类型(其实是Table表结构类型).如下代码所示:
可是问题又来了,用的时候,怎么传值给函数啊?杯具了,纠结了好一会,算了,还是笨一会吧,字符串分割好了。那么这个函数需要什么东东呢?
1.信息内容
2.参数列表(多个参数用分割符分开)
3.分割符(当然是跟2中一致的,不然,可就牛头不对马嘴了)
开始写吧,转头一想,是不是分成两个函数会更好呢?一个用于分割返回参数数组列表,另一个专就是调用分割函数得到参数列表后,做替换的动作,最后返回。en,想想不错,就写成两个吧,功能很单纯,很天真。
俗话说,他山之石,可以攻玉。百谷了一下,分割函数有现成的,拿来吧,请往下看:
2 RETURN stringarrary
3 IS
4 j INT := 0;
5 i INT := 1;
6 len INT := 0;
7 len1 INT := 0;
8 str VARCHAR2 (4000);
9 returnvalue stringarrary := stringarrary ();
10 BEGIN
11 IF (spliter IS NULL) OR (SOURCE IS NULL)
12 THEN
13 returnvalue.EXTEND;
14 returnvalue (1) := SOURCE;
15 ELSE
16 len := LENGTH (SOURCE);
17 len1 := LENGTH (spliter);
18
19 WHILE j < len
20 LOOP
21 j := INSTR (SOURCE, spliter, i);
22
23 IF j = 0
24 THEN
25 j := len;
26 str := SUBSTR (SOURCE, i);
27 returnvalue.EXTEND;
28 returnvalue (returnvalue.COUNT) := str;
29
30 IF i >= len
31 THEN
32 EXIT;
33 END IF;
34 ELSE
35 str := SUBSTR (SOURCE, i, j - i);
36 i := j + len1;
37 returnvalue.EXTEND;
38 returnvalue (returnvalue.COUNT) := str;
39 END IF;
40 END LOOP;
41 END IF;
42
43 RETURN returnvalue;
44 END stringsplit;
那就剩下外面的皮了,这个雕琢一下,也出来了:
2 SOURCE VARCHAR2,
3 param VARCHAR2,
4 spliter VARCHAR2
5 )
6 RETURN VARCHAR2
7 IS
8 i INT := 0;
9 len INT := 0;
10 params stringarrary := stringarrary ();
11 returnvalue VARCHAR2 (4000);
12 BEGIN
13 params := stringsplit (param, spliter);
14
15 IF params.COUNT > 0
16 THEN
17 len := params.COUNT;
18 returnvalue := SOURCE;
19
20 WHILE i < len
21 LOOP
22 returnvalue :=
23 REPLACE (returnvalue,
24 CONCAT (CONCAT ('{', TO_CHAR (i)), '}'),
25 params (i + 1)
26 );
27 i := i + 1;
28 END LOOP;
29 END IF;
30
31 RETURN returnvalue;
32 END stringreplace;
当然写完要测试下:
1.分割函数测试如下:
2 FROM TABLE (CAST (stringsplit ('1|12|123|1234||12345|', '|') AS stringarrary));
结果:
COLUMN_VALUE
1
12
123
1234
12345
还不赖。
2.测试外包函数了。
结果:
STRINGREPLACE('{0}+{1}={0}{1}','吱吱|YY','|')
吱吱+YY=吱吱YY
唔,自我感觉还不错。
完了,小某不才,欢迎各位拍砖,如果有更好的做法,望不吝指导,谢谢!
备注:Oralce PL/SQL中字符串的空怎么判断?
一定要用 IS NULL ,不能用 ='' 哦!!!!!