GPS平台、網站建設、軟件開發、系統運維,找森大網絡科技!
https://cnsendnet.taobao.com
來自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=2092
ORACLE使用函數對二進制、十進制、十六進制數互相轉換
1.將十進制的數轉換為十六進制的數請使用to_char函數。
數據庫中16進制的表達是按照字符串來描述的,所以將十進制的數轉換為十六進制的數使用to_char函數
BYS@bys1>select to_char(10,'xxx'), to_char(42,'xxx') from dual;
TO_C TO_C
---- ----
a 2a
2.將十六進制的數轉換為十進制的數請使用to_number函數。
如下,16進制A是10.2A是2*16+A=42.注意xxx,如果轉換的數比較大,要多寫幾個,避免位數不足而報錯。
BYS@bys1>select to_number('a','xxx'), to_number('2a','xxx') from dual;
TO_NUMBER('A','XXX') TO_NUMBER('2A','XXX')
-------------------- ---------------------
10 42
####################################################
ORACLE未提供二進制與十進制互轉的函數,可以自己創建。以下十進制與二進制轉換腳本引自惜紛飛博客,感謝!
3.十進制轉換二進制--使用自定義函數
CREATE OR REPLACE FUNCTION NUMBER_TO_BIT(V_NUM NUMBER)
RETURN VARCHAR IS V_RTN VARCHAR(8);--注意返回列長度
V_N1 NUMBER;
V_N2 NUMBER;
BEGIN
V_N1 := V_NUM;
LOOP
V_N2 := MOD(V_N1, 2);
V_N1 := ABS(TRUNC(V_N1 / 2));
V_RTN := TO_CHAR(V_N2) || V_RTN;
EXIT WHEN V_N1 = 0;
END LOOP;
--返回二進制長度
SELECT lpad(V_RTN,8,0)
INTO V_RTN
FROM dual;
return V_RTN;
end;
BYS@bys1>col a255 for a20
BYS@bys1>col a1 for a20
BYS@bys1>select number_to_bit(255) as a255,number_to_bit(1) as a1 from dual;
A255 A1
-------------------- --------------------
11111111 00000001
4.二進制轉換十進制--使用自定義函數
CREATE OR REPLACE FUNCTION BIT_TO_NUMBER(P_BIN IN VARCHAR2) RETURN NUMBER AS
V_SQL VARCHAR2(30000) := 'SELECT BIN_TO_NUM(';
V_RETURN NUMBER;
BEGIN
IF LENGTH(P_BIN) >= 256 THEN
RAISE_APPLICATION_ERROR(-20001, 'INPUT BIN TOO LONG!');
END IF;
IF LTRIM(P_BIN, '01') IS NOT NULL THEN
RAISE_APPLICATION_ERROR(-20002, 'INPUT STR IS NOT VALID BIN VALUE!');
END IF;
FOR I IN 1 .. LENGTH(P_BIN) LOOP
V_SQL := V_SQL || SUBSTR(P_BIN, I, 1) || ',';
END LOOP;
V_SQL := RTRIM(V_SQL, ',') || ') FROM DUAL';
EXECUTE IMMEDIATE V_SQL
INTO V_RETURN;
RETURN V_RETURN;
END;
BYS@bys1>select bit_to_number('11111111') from dual;
BIT_TO_NUMBER('11111111')
-------------------------
255
5.關於創建公有同義詞解決其它用戶引用當前用戶的定義函數的問題:
當前BYS用戶為DBA用戶,其它用戶默認無法使用當前用戶的自定義函數。
可以將自定義函數的執行權限授予PUBLIC用戶,並創建公有同義詞。這樣其它用戶就可以通過引用公有同義詞來使用新建的自定義函數了。
BYS@bys1>select * from user_objects where object_type='FUNCTION';
OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE
-------------------- ------------------------------ ---------- -------------- -------------------
CREATED LAST_DDL_TIME TIMESTAMP STATUS T G S NAMESPACE
------------------- ------------------- ------------------- ------- - - - ----------
EDITION_NAME
------------------------------
NUMBER_TO_BIT 76930 FUNCTION
2013/11/03 11:57:30 2013/11/03 11:57:30 2013-11-03:11:57:30 VALID N N N 1
BIT_TO_NUMBER 76931 FUNCTION
2013/11/03 12:00:16 2013/11/03 12:00:16 2013-11-03:12:00:16 VALID N N N 1
創建公有同義詞--先不將函數執行權限授予PUBLIC,此時從其它用戶使用函數報錯。
BYS@bys1>create public synonym number_to_bit for number_to_bit;
Synonym created.
BYS@bys1>conn test/test
Connected.
TEST@bys1>select number_to_bit(255) from dual;
select number_to_bit(255) from dual
*
ERROR at line 1:
ORA-00904: : invalid identifier
將函數執行權限授予PUBLIC,此時從其它用戶可以正常使用函數。
TEST@bys1>conn bys/bys
Connected.
BYS@bys1>grant execute on number_to_bit to public;
Grant succeeded.
BYS@bys1>conn test/test
Connected.
TEST@bys1>select number_to_bit(255) from dual;
NUMBER_TO_BIT(255)
----------------------------------------------------------------------------------------------------
11111111
#########################
對於bit_to_number函數,先將函數執行權限授予PUBLIC,但是並未創建同義詞。此時使用其它用戶執行函數報錯
BYS@bys1>grant execute on bit_to_number to public;
Grant succeeded.
TEST1@bys1>select bit_to_number(11111111) from dual;
select bit_to_number(11111111) from dual
*
ERROR at line 1:
ORA-00904: "BIT_TO_NUMBER": invalid identifier
TEST1@bys1>conn bys/bys
Connected.
此時對函數創建公有同義詞,使用其它用戶可以正常執行函數。
BYS@bys1>create public synonym bit_to_number for bit_to_number;
Synonym created.
BYS@bys1>conn test1/test1
Connected.
TEST1@bys1>select bit_to_number(11111111) from dual;
BIT_TO_NUMBER(11111111)
-----------------------
255
###################################################################
6.二進制與十六進制的轉換
因為沒有直接的函數,但是結合以上的十進制轉二進制與十進制轉十六進制函數,可以通過函數嵌套來實現二進制與十六進制的轉換。
即先使用二進制與十進制的轉換,再將轉換成的十進制做為參數轉換為十六進制。
BYS@bys1>select number_to_bit(17) as a255 from dual;
A255
--------------------
00010001
下面語句得出16進制數11,換算成十進制是17,轉換正確完成。
BYS@bys1>select to_char(bit_to_number('00010001'),'xxx') from dual;
TO_C
----
11
7.十六進制與二進制的轉換
BYS@bys1> select to_number('11','xxx') from dual;
TO_NUMBER('11','XXX')
---------------------
17
下面語句可以將16進制轉成二進制,與上面語句對比,轉換結果正確。
BYS@bys1> select number_to_bit(to_number('11','xxx')) from dual;
NUMBER_TO_BIT(TO_NUMBER('11','XXX'))
----------------------------------------------------------------------------------------------------
00010001
##############################################################################
8.其它轉換函數:
HEXTORAW
語法: HEXTORAW(string)
功能: 將由string表示的二進制數值轉換為一個RAW數值. String應該包含一個十六進制的數值. String中的每兩個字符表示了結果RAW中的一個字節..HEXTORAW和RAWTOHEX為相反的兩個函數.
使用位置: 過程性語言和SQL語句。
BYS@bys1>select hextoraw('abcdef') from dual;
HEXTOR
------
ABCDEF
RAWTOHEX
語法: RAWTOHEX(rawvalue)
功能: 將RAW類數值rawvalue轉換為一個相應的十六進制表示的字符串. rawvalue中的每個字節都被轉換為一個雙字節的字符串. RAWTOHEX和HEXTORAW是兩個相反的函數.
使用位置: 過程性語言和SQL語句。
BYS@bys1>SELECT RAWTOHEX('11') FROM DUAL;
RAWT
----
3131
BYS@bys1>SELECT RAWTOHEX('1') FROM DUAL;
RA
--
31
BYS@bys1>SELECT RAWTOHEX('2') FROM DUAL;
RA
--
32
RAWTONHEX
語法: RAWTONHEX(rawvalue)
功能: 將RAW類型值rawvalue轉換為一個十六進制表示的字符串。rawvalue中的每個字節轉換為一個雙字符的字符串。RAWTONHEX返回值是NVARCHAR2類型而不是VARCHAR2類型。
使用位置: 過程性語言和SQL語句。
GPS平台、網站建設、軟件開發、系統運維,找森大網絡科技!
https://cnsendnet.taobao.com
來自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=2092