hextoraw函式和rawtohex函式

2021-06-07 06:53:49 字數 1691 閱讀 9067

介紹下兩個函式的作用:

hextoraw():十六進製制字串轉換為raw;

rawtohex():將raw串轉換為十六進製制;

先來看下hextoraw()函式,當出現比f大的字母時(以a最小z最大)就會報錯:

正確結果:

sys@orcl> select hextoraw('abcdef') from dual;

hextor

------

abcdef

錯誤結果:

sys@orcl> select hextoraw('abcdeg') from dual;

select hextoraw('abcdeg') from dual

*error at line 1:

ora-01465: invalid hex number

再來看看rawtohex()函式:

sys@orcl> select rawtohex('aa') from dual;

rawt

----

4141

結果之所以是4141是因為a的ascii為65,65轉換為十六進製制就是41。

下面再看乙個較有疑惑的問題:

sys@orcl> declare

2  a varchar2(100);

3  begin

4  select rawtohex('aaaa') into a from dual;

5  dbms_output.put_line(a);

6  end;

7  /

61616161    

pl/sql procedure successfully completed.

sys@orcl> declare

2  a varchar2(100);

3  begin

4  a:=rawtohex('aaaa');

5  dbms_output.put_line(a);

6  end;

7  /

aaaa             

pl/sql procedure successfully completed.

為什麼會出現這種情況?

原因在於:select方法用的是sql 引擎,而:=是用pl/sql 引擎。

本例兩個呼叫中給的引數都是char型別,這時oracle要進行預設的型別轉換,把'aaaa'由char轉到raw。

但是sql引擎和pl/sql引擎的這個型別轉換卻不一樣,sql引擎使用了utl_raw.cast_to_raw,所以最後結果是'61616161',pl/sql使用了hextoraw,而手冊上的說法應該是用hextoraw,不知道為什麼。

因此在用到rawtohex()函式時,不應該給它自動型別轉換的機會,因為這是最容易出錯的。

如果你期待的結果是'61616161'就該這樣寫:rawtohex(utl_raw.cast_to_raw('aaaa'))

如果你期待的結果是'aaaa'就該這樣寫:rawtohex(hextoraw('aaaa'))

不管哪個引擎都不會錯了。

在使用sql*plus將raw型別獲取為乙個串時,會隱士的呼叫rawtohex函式,而插入串時會隱式的呼叫hextoraw函式,應該避免隱式轉換,而在編寫**時總是使用顯示轉換,這是乙個很好的實踐做法!

hextoraw函式和rawtohex函式

介紹下兩個函式的作用 hextoraw 十六進製制字串轉換為raw rawtohex 將raw串轉換為十六進製制 先來看下hextoraw 函式,當出現比f大的字母時 以a最小z最大 就會報錯 正確結果 sys orcl select hextoraw abcdef from dual hextor...

巨集和函式和內聯函式

巨集和函式的區別 巨集做的是簡單的字串替換 注意是字串的替換,不是其他型別引數的替換 而函式的引數的傳遞,引數是有資料型別的,可以是各種各樣的型別.巨集的引數替換是不經計算而直接處理的,而函式呼叫是將實參的值傳遞給形參,既然說是值,自然是計算得來的.巨集在編譯之前進行,即先用巨集體替換巨集名,然後再...

函式和建構函式

函式使用function關鍵字來定義,可以用在函式定義表示式或函式宣告語句中。函式呼叫的4種方法 1 作為函式 1 這是乙個普通函式 2function range 3 函式表示式 4var range function 56 呼叫7 range 2 作為建構函式 看建構函式部分 3 作為方法 1 ...