通过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 所以通过对比的学习能够分析出一些共同点和不同点,融会贯通还是很有用的。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2015-02-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java学习

Java基础第三天学习笔记

03.01_Java语言基础(逻辑运算符的基本用法)(掌握) * A:逻辑运算符有哪些 * &,|,^,! * &&,|| * B:案例演示 * 逻辑运算...

2867
来自专栏Linyb极客之路

简洁又快速地处理集合——Java8 Stream(下)

而 parallelStream() 是并行流方法,能够让数据集执行并行操作,后面会更详细地讲解

10.6K11
来自专栏Java帮帮-微信公众号-技术文章全总结

第十五天 常用API-object&string&stringbuilder&stringbuffer【悟空教程】

第十五天 常用API-object&string&stringbuilder&stringbuffer【悟空教程】

1231
来自专栏机器学习入门

LWC 53:691. Stickers to Spell Word

LWC 53:691. Stickers to Spell Word 传送门:691. Stickers to Spell Word Problem: We ...

3575
来自专栏醒者呆

正则表达式——Java程序员懂你

正则表达式 关键字:正则表达式,Pattern,Matcher,字符串方法,split,replace 前文书立下了一个flag,这里要把它完成,就是正则...

3765
来自专栏有趣的Python

慕课网-Linux C语言结构体-学习笔记

Linux C语言结构体 编译指令:预处理,宏定义, 建立自己的数据类型:结构体,联合体,动态数据结构 逻辑运算符:& | ^ ~ << >> 递归函...

4708
来自专栏于晓飞的专栏

Java 泛型进阶

在 List<String> 中添加 Integer 将不会通过编译,但是List<Sring>与List<Integer>在运行时的确是同一种类型。

2053
来自专栏微信公众号:Java团长

初学者应该了解的数据结构:Array、HashMap 与 List

当开发程序时,我们(通常)需要在内存中存储数据。根据操作数据方式的不同,可能会选择不同的数据结构。有很多常用的数据结构,如:Array、Map、Set、List...

962
来自专栏技术博客

C#字符串(字节)的长度

顺便看一下Sql Server中char nchar varchar  nvarchar

4922
来自专栏有趣的Python

慕课网-c语言入门-学习笔记

个人整理,学习自用。课程内容by慕课网。 c语言入门 C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效...

8556

扫码关注云+社区

领取腾讯云代金券