通過shell來比較oracle和java中的字串使用
今天在無意中看到了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
所以通過對比的學習能夠分析出一些共同點和不同點,融會貫通還是很有用的。
比如我們使用一個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
來看一個類似的簡單例子
[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
在字串中用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
將一個字串按照指定的分隔符分隔,返回分隔後的字串陣列
oracle中目前沒有發現有現成的方法實現,只能自己DIY通過pl/sql來實現,內部也是在使用substr來遞迴解析。
下面的例子會將字串”abcd abcd"以空格分割,最後返回的是一個陣列,我們來看看裡面的內容。
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
所以通過對比的學習能夠分析出一些共同點和不同點,融會貫通還是很有用的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1438070/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 透過shell來比較oracle和java中的字串使用OracleJava字串
- shell 下的字串比較字串
- Java™ 教程(比較字串和字串的部分)Java字串
- oracle中字串的大小比較,字串與數字的比較和運算Oracle字串
- shell下數字和字串比較操作命令字串
- JAVA字串比較Java字串
- shell比較兩個字串是否相等字串
- 比較字串和數字串字串
- ORACLE 中IN和EXISTS比較Oracle
- 通過Comparable來實現對自身的比較
- 比較字串和數字串(續)字串
- (轉)ORACLE 中IN和EXISTS比較Oracle
- JAVA中字串比較equals()和equalsIgnoreCase()的區別Java字串
- Delphi中字串比較大小 VS Oracle-SQL中字串比較大小字串OracleSQL
- Java中的字串操作(比較String,StringBuiler和StringBuffer)Java字串UI
- 字串大小寫轉換和字串的比較字串
- Java 字串比較、拼接問題Java字串
- Java字串建立方式比較Java字串
- 字串比較字串
- Java 中 Comparable 和 Comparator 比較Java
- Java和JavaSciprt比較Java
- [shell基礎]——整數比較;字串比較;檔案測試;邏輯測試符字串
- SAP ABAP ADBC和Java JDBC的使用比較JavaJDBC
- VC 中字串比較和查詢字串
- 通過append hint來插入資料,演示它和普通插入資料的效能比較。APP
- 字串-簡單字串比較字串
- PHP比較字串PHP字串
- 【索引】oracle查詢使用索引和不使用索引的比較索引Oracle
- Oracle date 型別比較和String比較Oracle型別
- JAVA中的Comparable介面和自定義比較器Java
- [Oracle] minus 和 not exists比較Oracle
- 使用String. localeCompare比較字串字串
- Oracle 中 replace函式和translate函式比較Oracle函式
- 一個字串比較的題字串
- 字串比較的常用函式字串函式
- Java中List集合效能比較Java
- MySQL中的NULL和空串比較MySqlNull
- oracle中發郵件的儲存過程--功能比較強(摘)Oracle儲存過程