Oracle中Base64的使用

denglt發表於2010-11-12
utl_encode包中的下面兩個函式是用來進行Base64編碼和解碼的
  /*----------------------------------------------------------------*/
  /* BASE64_ENCODE                                                  */
  /*----------------------------------------------------------------*/
  function base64_encode(r in raw) return raw;
  /*----------------------------------------------------------------*/
  /* BASE64_DECODE                                                  */
  /*----------------------------------------------------------------*/
  function base64_decode(r in raw) return raw;
下面看看使用方法:
 
SQL> select utl_encode.BASE64_ENCODE('denglt2') from dual;
 
select utl_encode.BASE64_ENCODE('denglt2') from dual
 
ORA-01465: 無效的十六進位制數字
 
SQL> select utl_encode.BASE64_ENCODE(utl_raw.cast_to_raw('denglt2')) from dual;
 
UTL_ENCODE.BASE64_ENCODE(UTL_R
--------------------------------------------------------------------------------
5A4756755A3278304D673D3D
 
如果對Base64有點了解的話,這兒的結果肯定不是Base64的編碼('denglt2'對3求餘數後為1,按照Base64的編碼規範出來的結果最後兩個字元應該為==).我再進行如下的轉換
 
SQL> select utl_raw.cast_to_varchar2('5A4756755A3278304D673D3D') from dual;
 
UTL_RAW.CAST_TO_VARCHAR2('5A47
--------------------------------------------------------------------------------
ZGVuZ2x0Mg==
 
這兒就是base64的編碼了。
現在我們再進行解碼:
SQL> select  utl_raw.cast_to_varchar2(utl_encode. base64_decode(utl_raw.cast_to_raw('ZGVuZ2x0Mg==')))  from dual;
 
UTL_RAW.CAST_TO_VARCHAR2(UTL_E
--------------------------------------------------------------------------------
denglt2
 
 
這兒有一點可能有點迷糊 "function base64_encode(r in raw) return raw"的返回型別是raw.實際上反回的是編號後字串的二進位制raw資料,同時在Oracle裡raw與十六進位制的字串是可以相互自動轉換的,所以看到的結果是5A4756755A3278304D673D3D。
raw與十六進位制的字串是可以相互自動轉換的例子(但BLOB型別不能夠):
 
SQL> create table t_blob (b blob);
 
Table created
 
SQL> insert into t_blob (b) values (utl_raw.cast_to_raw('denglt'));
 
1 row inserted
 
SQL> commit;
 
Commit complete
 
SQL> set serveroutput on ;
SQL> declare
  2    vB long raw;
  3    vStr varchar2(2000);
  4  begin
  5   select b into vB from t_blob where rownum=1;
  6   dbms_output.put_line(utl_raw.cast_to_varchar2(vB));
  7   vStr := vB;
  8   dbms_output.put_line(vStr);
  9   vB := vStr;
 10   dbms_output.put_line(utl_raw.cast_to_varchar2(vB));
 11  end;
 12  /
 
denglt
64656E676C74
denglt
 
PL/SQL procedure successfully completed
 
declare
  vB blob;  --換成blob
  vStr varchar2(2000);
begin
 select b into vB from t_blob where rownum=1;
 dbms_output.put_line(utl_raw.cast_to_varchar2(vB));
 vStr := vB;
 dbms_output.put_line(vStr);
 vB := vStr;
 dbms_output.put_line(utl_raw.cast_to_varchar2(vB));
end;
 
ORA-06550: 第 8 行, 第 10 列:
PLS-00382: 表示式型別錯誤
ORA-06550: 第 8 行, 第 2 列:
PL/SQL: Statement ignored
ORA-06550: 第 10 行, 第 8 列:
PLS-00382: 表示式型別錯誤
ORA-06550: 第 10 行, 第 2 列:
PL/SQL: Statement ignored
 
 
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/195110/viewspace-677977/,如需轉載,請註明出處,否則將追究法律責任。

相關文章