sql >> データベース >  >> RDS >> Oracle

OracleでのBase64エンコーディングとデコーディング

    これを実装して、MSExchangeサーバーを介してキリル文字の電子メールを送信しました。

    function to_base64(t in varchar2) return varchar2 is
     begin
        return utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(t)));
    end to_base64;
    

    試してみてください。

    upd: 少し調整した後、これを思いついたので、今は両方の方法で機能します:

    function from_base64(t in varchar2) return varchar2 is
    begin
      return utl_raw.cast_to_varchar2(utl_encode.base64_decode(utl_raw.cast_to_raw(t)));
    end from_base64;
    

    あなたはそれをチェックすることができます:

    SQL> set serveroutput on
    SQL> 
    SQL> declare
      2    function to_base64(t in varchar2) return varchar2 is
      3    begin
      4      return utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(t)));
      5    end to_base64;
      6  
      7    function from_base64(t in varchar2) return varchar2 is
      8    begin
      9      return utl_raw.cast_to_varchar2(utl_encode.base64_decode(utl_raw.cast_to_raw    (t)));
     10    end from_base64;
     11  
     12  begin
     13    dbms_output.put_line(from_base64(to_base64('asdf')));
     14  end;
     15  /
    
    asdf
    
    PL/SQL procedure successfully completed
    

    upd2: OK、これがCLOBで機能する変換例です 私はちょうど思いついた。あなたのブロブのためにそれを解決してみてください。 :)

    declare
    
      clobOriginal     clob;
      clobInBase64     clob;
      substring        varchar2(2000);
      n                pls_integer := 0;
      substring_length pls_integer := 2000;
    
      function to_base64(t in varchar2) return varchar2 is
      begin
        return utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(t)));
      end to_base64;
    
      function from_base64(t in varchar2) return varchar2 is
      begin
        return utl_raw.cast_to_varchar2(utl_encode.base64_decode(utl_raw.cast_to_raw(t)));
      end from_base64;
    
    begin
    
      select clobField into clobOriginal from clobTable where id = 1;
    
      while true loop
    
        /*we substract pieces of substring_length*/
        substring := dbms_lob.substr(clobOriginal,
                                     least(substring_length, substring_length * n + 1 - length(clobOriginal)),
                                     substring_length * n + 1);  
        /*if no substring is found  - then we've reached the end of blob*/
    
        if substring is null then
          exit;
        end if;  
    
        /*convert them to base64 encoding and stack it in new clob vadriable*/
        clobInBase64 := clobInBase64 || to_base64(substring);          
        n := n + 1;  
    
      end loop;
    
      n := 0;
      clobOriginal := null;
    
      /*then we do the very same thing backwards - decode base64*/
      while true loop 
    
        substring := dbms_lob.substr(clobInBase64,
                                     least(substring_length, substring_length * n + 1 - length(clobInBase64)),
                                     substring_length * n + 1);  
        if substring is null then
          exit;
        end if;  
        clobOriginal := clobOriginal || from_base64(substring);  
        n := n + 1;  
      end loop; 
    
          /*and insert the data in our sample table - to ensure it's the same*/
      insert into clobTable (id, anotherClobField) values (1, clobOriginal);
    
    end;
    


    1. MariaDBのHOUR()とEXTRACT(HOUR…):違いは何ですか?

    2. 日時列から日付を選択するにはどうすればよいですか?

    3. SolarisでのPostgreSQLプロセス名

    4. xamppMySQLが起動しない