通过shell来比较oracle和java中的字符串使用

简介: 今天在无意中看到了java字符串的一些东西,发现和oracle比较起来还是有一定的意义的,但是发现知识点准备好了,比较的时候,每一处java的变更都得重编译运行还是不够直观,其实代码中变化的部分很固定,所以尝试写了一个简单的shell脚本来实现动态编译运行,使得演示也更加直观,使用Runtime.exec还是有一些限制。
今天在无意中看到了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 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

所以通过对比的学习能够分析出一些共同点和不同点,融会贯通还是很有用的。
目录
相关文章
|
6天前
|
安全 Java API
【Java字符串操作秘籍】StringBuffer与StringBuilder的终极对决!
【8月更文挑战第25天】在Java中处理字符串时,经常需要修改字符串,但由于`String`对象的不可变性,频繁修改会导致内存浪费和性能下降。为此,Java提供了`StringBuffer`和`StringBuilder`两个类来操作可变字符串序列。`StringBuffer`是线程安全的,适用于多线程环境,但性能略低;`StringBuilder`非线程安全,但在单线程环境中性能更优。两者基本用法相似,通过`append`等方法构建和修改字符串。
32 1
|
11天前
|
Java 编译器
【Java基础面试三十】、 两个字符串相加的底层是如何实现的?
这篇文章解释了Java中两个字符串相加的底层实现:对于字符串直接量的拼接,编译器在编译时会进行优化合并;而对于包含变量的字符串拼接,编译器会采用`StringBuilder`进行优化,自动创建实例并调用`append()`方法来拼接字符串。
|
8天前
|
存储 Java
|
9天前
|
JavaScript 关系型数据库 Shell
Linux shell编写技巧之随机取字符串(一)
本文介绍了Linux Shell脚本的编写技巧,包括环境配置、变量命名规则和缩进语法,并提供了一个实例练习,展示如何使用`$RANDOM`变量和`md5sum`命令来生成随机的8位字符串。
25 4
|
8天前
|
存储 Java
如何在 Java 中打印字符串数组列表
【8月更文挑战第23天】
19 2
|
8天前
|
存储 Java API
|
11天前
|
安全 Java 编译器
【Java基础面试二十九】、说一说你对字符串拼接的理解
这篇文章讨论了Java中字符串拼接的四种常用方式(使用`+`运算符、`StringBuilder`、`StringBuffer`和`String`类的`concat`方法),每种方式适用的场景,以及在不同情况下的性能考量。
|
10天前
|
Java 测试技术
Java系列之判断字符串是为空或者null
这篇文章介绍了如何在Java中使用`isEmpty()`方法判断字符串是否为空或`null`,并提供了相应的测试用例来演示其用法。
|
10天前
|
Java
Java系列 之除字符串中的空格(trim())
这篇文章介绍了Java中`String`类的`trim()`方法,用于去除字符串首尾的空格,并指出`trim()`只能去除半角空格,对于全角空格需要先用`replace()`方法替换成半角空格再进行去除。

推荐镜像

更多
下一篇
云函数