通过shell来比较oracle和java中的字符串使用(r4笔记第49天)

时间:2022-05-04
本文章向大家介绍通过shell来比较oracle和java中的字符串使用(r4笔记第49天),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

今天在无意中看到了java字符串的一些东西,发现和oracle比较起来还是有一定的意义的,但是发现知识点准备好了,比较的时候,每一处java的变更都得重编译运行还是不够直观,其实代码中变化的部分很固定,所以尝试写了一个简单的shell脚本来实现动态编译运行,使得演示也更加直观,使用Runtime.exec还是有一些限制。 比如我们使用一个test1.sh的脚本,这个脚本会根据输入参数动态生成java代码然后自动编译运行。 echo "public class Test{ ">Test.java echo " public static void main (String[] args) {">>Test.java echo "System.out.println($1);">>Test.java echo " }">>Test.java echo "}" >>Test.java $ORACLE_HOME/jdk/bin/javac Test.java $ORACLE_HOME/jdk/bin/java Test 先来看看效果使用charAt方法 [ora11g@rac1 ~]$ ksh test1.sh 'new String("abcd").charAt(1)' b 在oracle中如果想使用动态的调用就更直接了。我们假设脚本为test2.sh,基本能够覆盖一些常用的例子。 sqlplus -s n1/n1 <<EOF select $1 from dual; EOF 来看一个类似的简单例子 [ora11g@rac1 ~]$ ksh test2.sh "substr('abcd',1)" SUBS ---- abcd

这些准备工作齐了之后,我们来从Java中的字符串使用入手来比较一下oracle中对于字符串的处理。 java中有如下的一些函数,我会依次来做比较。 public char charAt(int index) 返回字符串中第index个字符; oracle中可以使用substr来简单实现,需要注意两种方式的下标,在java的charAt中是以0开始,而在oracle中的substr中则是以1开始计数的。 [ora11g@rac1 ~]$ ksh test1.sh 'new String("abcd").charAt(2)' c [ora11g@rac1 ~]$ ksh test2.sh "substr('abcd',3,1)" S - c public int length() 返回字符串的长度; oracle中可以使用length函数,使用方式也是很类似的。 [ora11g@rac1 ~]$ ksh test1.sh 'new String("abcd").length()' 4 [ora11g@rac1 ~]$ ksh test2.sh "length('abcd')" LENGTH('ABCD') -------------- 4 public int indexOf(String str) 返回字符串中第一次出现str的位置; oracle中可以使用instr来模拟实现,而且oracle可以更加的灵活。注意下标的不同 ksh test1.sh 'new String("abcdc").indexOf("c")' 2 [ora11g@rac1 ~]$ ksh test2.sh "instr('abcdc','c',1,1)" INSTR('ABCDC','C',1,1) ---------------------- 3 顺便扩展一下,oracle中如果要得到某个字符串第几次出现的下标,相对就更直接了,比如字符串“abcdc"中第二次出现字符c的下标 [ora11g@rac1 ~]$ ksh test2.sh "instr('abcdc','c',1,2)" INSTR('ABCDC','C',1,2) ---------------------- 5 public int indexOf(String str,int fromIndex) 返回字符串从fromIndex开始第一次出现str的位置; oracle中还是使用Instr,而且使用方法和上例类似。 我们对字符串abcd从下标为1,即字符b所对应的下标开始。 [ora11g@rac1 ~]$ ksh test1.sh 'new String("abcdc").indexOf("c",1)' 2 [ora11g@rac1 ~]$ ksh test2.sh "instr('abcdc','c',2,1)" INSTR('ABCDC','C',2,1) ---------------------- 3 public boolean equalsIgnoreCase(String another) 比较字符串与another是否一样(忽略大小写); oracle中实现方式略有不同,不过可以直接转换为大写或者小写即可。 [ora11g@rac1 ~]$ ksh test1.sh 'new String("abcd").equalsIgnoreCase("abcD")' true SQL> select 1 from dual where upper('abcD')='ABCD'; 1 ---------- 1

public String replace(char oldchar,char newChar) 在字符串中用newChar字符替换oldChar字符 oracle中的使用也有replace函数,用法也是一致的。 [ora11g@rac1 ~]$ ksh test1.sh 'new String("abcd").replace("c","g")' abgd [ora11g@rac1 ~]$ ksh test2.sh "replace('abcd','c','g')" REPL ---- abgd public boolean startsWith(String prefix) 判断字符串是否以prefix字符串开头; public boolean endsWith(String suffix) 判断一个字符串是否以suffix字符串结尾; oracle中的实现可以通过匹配符%来实现,也可以使用正则表达式。 [ora11g@rac1 ~]$ ksh test1.sh 'new String("abcd").startsWith("a")' true [ora11g@rac1 ~]$ ksh test1.sh 'new String("abcd").endsWith("d")' true SQL> select 1 from dual where 'abcd' like 'a%'; 1 ---------- 1 SQL> select 1 from dual where 'abcd' like '%d'; 1 ---------- 1 public String toUpperCase() 返回一个字符串为该字符串的大写形式; public String toLowerCase() 返回一个字符串为该字符串的小写形式 oracle中有upper()和lower()方法,用法效果是一致的。 [ora11g@rac1 ~]$ ksh test1.sh 'new String("abcd").toUpperCase()' ABCD [ora11g@rac1 ~]$ ksh test1.sh 'new String("ABcd").toLowerCase()' abcd [ora11g@rac1 ~]$ ksh test2.sh "upper('abcd')" UPPE ---- ABCD [ora11g@rac1 ~]$ ksh test2.sh "lower('ABcd')" LOWE ---- abcd public String substring(int beginIndex) 返回该字符串从beginIndex开始到结尾的子字符串; public String substring(int beginIndex,int endIndex) 返回该字符串从beginIndex开始到endsIndex结尾的子字符串 oracle中也有substring,相比来说功能要更丰富,注意在java中是substring,而在oracle是substr [ora11g@rac1 ~]$ ksh test1.sh 'new String("ABcd").substring(1)' Bcd [ora11g@rac1 ~]$ ksh test2.sh "substr('ABcd',1)" SUBS ---- ABcd [ora11g@rac1 ~]$ ksh test1.sh 'new String("ABcd").substring(1,2)' B [ora11g@rac1 ~]$ ksh test1.sh 'new String("ABcd").substring(1,3)' --注意这种用法的下标,当下标为(1,3)时,才会输出下标为1和2的字符。 Bc [ora11g@rac1 ~]$ ksh test2.sh "substr('ABcd',1,2)" --注意oracle中的小标是从1开始,最后的参数2代表需要截取的字符串长度为2,所以截取了AB SU -- AB public String trim() 返回该字符串去掉开头和结尾空格后的字符串 oracle中有trim函数,而且还有ltrim,rtrim等支持的功能也要丰富一些。 [ora11g@rac1 ~]$ ksh test1.sh 'new String("abcd ").trim()' abcd [ora11g@rac1 ~]$ ksh test2.sh "trim('abcd ')" TRIM ---- abcd ltrim就是截取左边的空白字符,rtrim就是截取右边的空白字符。 [ora11g@rac1 ~]$ ksh test2.sh "ltrim(' abcd')" LTRI ---- abcd

public String[] split(String regex) 将一个字符串按照指定的分隔符分隔,返回分隔后的字符串数组 oracle中目前没有发现有现成的方法实现,只能自己DIY通过pl/sql来实现,内部也是在使用substr来递归解析。 下面的例子会将字符串”abcd abcd"以空格分割,最后返回的是一个数组,我们来看看里面的内容。

[ora11g@rac1 ~]$ ksh test1.sh 'new String("abcd abcd").split(" ")[0]' abcd [ora11g@rac1 ~]$ ksh test1.sh 'new String("abcd abcd").split(" ")[1]' abcd 通过pl/sql来实现网上也有不少现成的方法,得来全不费功夫。 create or replace type tabstr_t as table of varchar2(4000); / create or replace function tabstr ( p_str in varchar2, p_sep in varchar2 default ' ' ) return tabstr_t is l_str long := p_str || p_sep; l_tabstr tabstr_t := tabstr_t(); begin while l_str is not null loop l_tabstr.extend(1); l_tabstr(l_tabstr.count) := rtrim(substr( l_str,1,instr(l_str,p_sep)),p_sep); l_str := substr(l_str,instr(l_str,p_sep)+1); end loop; return l_tabstr; end; / var s varchar2(100) exec :s := 'abcd abcd' select upper(column_value) from table(cast(tabstr(:s) as tabstr_t)); UPPER(COLUMN_VALUE) -------------------------------------------------------------------------------- ABCD ABCD 所以通过对比的学习能够分析出一些共同点和不同点,融会贯通还是很有用的。