zoukankan      html  css  js  c++  java
  • 通过Oracle函数实现.NET String.Format函数的简单版

          由于开发需要,想实现一些提示信息的通用,比如,提示信息内容:“XXX的值YYY不正确,请检查并重新输入!”,那么,通用的信息内容就应该为:“{0}的值{1}不正确,请检查并重新输入!”。但这个“{0}”和"{1}"怎么替换掉呢?在.net中,字符串有String.Format函数,这样我们就可以很容易地去根据不同的内容,替换成不一样的内容,但Oracle里面还没有样的函数(据个人所知,不知道有没有孤漏寡闻!),但又想用,所以就只能自己写了。

          想了想,有问题啊,且听我道来:

          信息内容中有多个参数,并且都是用花括号中带数字来表示,如{0},{1},{2},那么,这些参数最好能用数组来表示,但Oracle PL/SQL中有数组吗?都怪自己平时不努力,书到用时方恨少啊。在网上百谷了一下,Oralce里面没有现成的数据类型,只有通过自定义数组类型(其实是Table表结构类型).如下代码所示: 

    String Array Type Defintion
    1 CREATE OR REPLACE TYPE stringarrary IS TABLE OF VARCHAR2 (4000);

          可是问题又来了,用的时候,怎么传值给函数啊?杯具了,纠结了好一会,算了,还是笨一会吧,字符串分割好了。那么这个函数需要什么东东呢?

          1.信息内容

          2.参数列表(多个参数用分割符分开)

          3.分割符(当然是跟2中一致的,不然,可就牛头不对马嘴了)

          开始写吧,转头一想,是不是分成两个函数会更好呢?一个用于分割返回参数数组列表,另一个专就是调用分割函数得到参数列表后,做替换的动作,最后返回。en,想想不错,就写成两个吧,功能很单纯,很天真。

          俗话说,他山之石,可以攻玉。百谷了一下,分割函数有现成的,拿来吧,请往下看:

    String Split function Definition
     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;
       

    那就剩下外面的皮了,这个雕琢一下,也出来了:

    String Replace Function Definition
    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;

    当然写完要测试下:

          1.分割函数测试如下:      

    stringsplit test code
    1 SELECT *
    2   FROM TABLE (CAST (stringsplit ('1|12|123|1234||12345|''|'AS stringarrary));

            结果:    

                   COLUMN_VALUE
                   1
                   12
                   123
                   1234
        
                   12345

            还不赖。

          2.测试外包函数了。

    stringreplace test
    1 select stringreplace('{0}+{1}={0}{1}','吱吱|YY','|'from dual;

            结果:

              STRINGREPLACE('{0}+{1}={0}{1}','吱吱|YY','|')
              吱吱+YY=吱吱YY

            唔,自我感觉还不错。

           完了,小某不才,欢迎各位拍砖,如果有更好的做法,望不吝指导,谢谢!

     

    备注:Oralce PL/SQL中字符串的空怎么判断?

           一定要用   IS NULL ,不能用 =''  哦!!!!!

  • 相关阅读:
    python自学第13天 hashlib,re模块
    python自学第12天 模块
    python自学第12天 模块定义,导入,内置模块
    python自学第11天-单线程并发、迭代器,序列化,获取路径
    python自学第10天,生成器
    python自学第9天,装饰器
    python自学第8天,变量,递归
    python自学第7天,函数,参数
    彻底搞懂Session与Cookie的异同!
    你真的搞懂了Java中的<<、>>、>>>运算符嘛?
  • 原文地址:https://www.cnblogs.com/hugh251325/p/Oracle_String_Format.html
Copyright © 2011-2022 走看看