语言国际化要求,开发上要求Oracle数据库SQL中对应的返回信息-Message,实现一个通用函数调用,比如:提示信息内容:条码123456当前工站在FCT!”,即通用的信息内容格式化标准为:“条码{0}当前工站在{1}!”。

  在C#代码中可以通过String.Format函数占位符替换的模式实现字符串格式化输出,Oracle中暂无此函数,所以可参考String.Format反编译的相应的逻辑去实现即可;

信息内容中多个参数,是以占位符{}来表示,多个参数则用数组;通过自定义数组类型(即Table表结构类型).如下代码所示:

1 CREATE OR REPLACE TYPE stringarrary IS TABLE OF VARCHAR2 (4000);

 FUNCTION---StringSplit(参数--信息内容,参数--分割符)

--分割函数CREATE OR REPLACE FUNCTION StringSplit (
SOURCE VARCHAR2, --信息内容
spliter VARCHAR2--分割符
)
RETURN stringarrary
IS
j INT := 0;
i INT := 1;
len INT := 0;
len1 INT := 0;
str VARCHAR2 (4000);
returnvalue stringarrary := stringarrary ();
BEGIN
IF (spliter IS NULL) OR (SOURCE IS NULL)
THEN
returnvalue.EXTEND;
returnvalue (1) := SOURCE;
ELSE
len := LENGTH (SOURCE);
len1 := LENGTH (spliter); WHILE j < len
LOOP
j := INSTR (SOURCE, spliter, i); IF j = 0
THEN
j := len;
str := SUBSTR (SOURCE, i);
returnvalue.EXTEND;
returnvalue (returnvalue.COUNT) := str; IF i >= len
THEN
EXIT;
END IF;
ELSE
str := SUBSTR (SOURCE, i, j - i);
i := j + len1;
returnvalue.EXTEND;
returnvalue (returnvalue.COUNT) := str;
END IF;
END LOOP;
END IF; RETURN returnvalue;
END stringsplit;
 1 CREATE OR REPLACE FUNCTION stringsplit (SOURCE VARCHAR2, spliter VARCHAR2)
 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;
   

1.分割函数测试如下:

 SELECT *
FROM TABLE (CAST (StringSplit ('1|12|123|1234||12345|', '|') AS stringarrary));

测试  结果:

COLUMN_VALUE
               1                          
               12                        
               123                      
               1234                    
                                           
               12345 

OK。

然后封装函数StringFormat:

CREATE OR REPLACE FUNCTION StringFormat (SOURCE     VARCHAR2,
param VARCHAR2,
spliter VARCHAR2)
RETURN VARCHAR2
IS
i INT := 0;
len INT := 0;
params stringarrary := stringarrary ();
returnvalue VARCHAR2 (4000);
BEGIN
params := stringsplit (param, spliter); IF params.COUNT > 0
THEN
len := params.COUNT;
returnvalue := SOURCE; WHILE i < len
LOOP
returnvalue :=
REPLACE (returnvalue,
CONCAT (CONCAT ('{', TO_CHAR (i)), '}'),
params (i + 1));
i := i + 1;
END LOOP;
END IF; RETURN returnvalue;
END stringreplace;
1 CREATE OR REPLACE FUNCTION stringreplace (
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;
       2.测试Oracle---StringFormat函数了。
SELECT StringFormat('条码{0}当前工站在{1}!', '123456|FCT', '|') FROM DUAL;
1 select stringreplace('{0}+{1}={0}{1}','吱吱|YY','|') from dual;

测试结果:

条码123456当前工站在FCT! 

通过Oracle函数SQL实现C# String.Format字符串格式化功能的更多相关文章

  1. string.Format字符串格式化说明(转)

    string.Format字符串格式化说明 www.111cn.net 编辑:Crese 来源:转载   先举几个简单的应用案例: 1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统 ...

  2. string.Format字符串格式化说明

    1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...

  3. string.Format()字符串格式化

    Format()基本语法:     {索引[,对齐][:格式字符串]}     ·索引:表示引用的对象列表中的第n个对象参数.     ·对齐(可选):设置宽度与对齐方式,该参数为带符号的整数.正数为 ...

  4. 前端自定义format函数,做字符串格式化功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Java中利用MessageFormat对象实现类似C# string.Format方法格式化

    我们在写C#代码的时候常常会使用到string.Format("待格式化字符串{0},{1},....",参数1,参数2,...),来格式化字符串,特别是拼接字符的时候,这种方式使 ...

  6. String.Format数字格式化参考

    String.Format数字格式化输出 {0:N2} {0:D2} {0:C2} (转) 数字 {0:N2} 12.36 数字 {0:N0} 13 货币 {0:c2} $12.36 货币 {0:c4 ...

  7. String.Format数字格式化输出 {0:N2} {0:D2} {0:C2} (转)

    String.Format数字格式化输出 {:N2} {:D2} {:C2} (转) //格式为sring输出 // Label1.Text = string.Format("asdfads ...

  8. 第3.11节 Python强大的字符串格式化新功能:format字符串格式化的格式控制

                                                第3.11节 format字符串格式化的格式控制 一.    引言 上节介绍了四种format进行字符串格式化的 ...

  9. python 之format字符串格式化

    print函数之format字符串格式化方法的使用与学习笔记. 一.映射关系 (1)“映射”示例,以下通过位置举例说明: [+]Example_1: >>> print(" ...

随机推荐

  1. Error Handling Functions(微软对于出错的情况下提供的所有函数,比如SetThreadErrorMode,SetErrorMode,SetLastErrorEx,FatalAppExit,CaptureStackbackTrace)

    The following functions are used with error handling. Function Description Beep Generates simple ton ...

  2. Robot Framework 怎样写好Test Case

    1.介绍 这是一个关于如何用Robot Framework写好Test Case的高层次的指导准则 怎样实际的与系统进行交互不在此文档范围内 最重要的准则是使测试用例尽可能的让熟悉此领域的人觉得简单易 ...

  3. Aaron Swartz Rewriting Reddit中关于web.py的创建思路

    这天才少年居然自杀了,哎 原文点这 So how should things work? The first principle is that code should be clear and si ...

  4. TC SRM 597 DEV2

    第一次玩TC的SRM,只完成了一题,有点失落,不过还是要把每个问题都研究清楚才是我的本性,呵呵 第一题思路: 任意一个数,不断除掉2以后的剩下的数若相同则YES否则NO 第二题: 最开始判断字母个数是 ...

  5. Swift-AES之加密解密

    什么是AES 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代 ...

  6. 【POJ 1364】 King

    [题目链接] 点击打开链接 [算法] 差分约束系统 [代码] #include <algorithm> #include <bitset> #include <cctyp ...

  7. Maximum Gap 典型线性排序

    https://leetcode.com/problems/maximum-gap/ Given an unsorted array, find the maximum difference betw ...

  8. J20170616-hm

    所以(ゆえん) 理由,原因,来由

  9. bzoj1052覆盖问题(二分+贪心)

    1052: [HAOI2007]覆盖问题 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2446  Solved: 1131[Submit][Stat ...

  10. python自动化测试学习笔记-7面向对象编程,类,继承,实例变量,邮件

    面向对象编程(OOP)术语: class TestClass(object):   val1 = 100       def __init__(self):     self.val2 = 200   ...