Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

CLOB डेटा को डिक्रिप्ट करने के लिए DBMS_CRYPTO फ़ंक्शन का उपयोग करते समय त्रुटि

त्रुटि लाइन 33 से आ रही है, जो है:

l_raw    := UTL_ENCODE.base64_decode(l_temp);

base64_decode समारोह रॉ तर्क की अपेक्षा करता है, ताकि आप अपने पास मौजूद स्ट्रिंग को रूपांतरित कर सकें:

l_raw    := UTL_ENCODE.base64_decode(UTL_RAW.cast_to_raw(l_temp));

यानी

   FOR i IN 0 .. TRUNC((DBMS_LOB.getlength(ac_input) - 1 )/l_amt) LOOP
      DBMS_LOB.read(ac_input, l_amt, l_offset, l_temp);
      l_offset := l_offset + l_amt;
      l_raw    := UTL_ENCODE.base64_decode(UTL_RAW.cast_to_raw(l_temp));
      DBMS_LOB.append (l_blob, TO_BLOB(l_raw));
    END LOOP; 

आपके बेस-64 स्ट्रिंग में लाइन ब्रेक हैं; वे डिकोड बाहर फेंक रहे हैं। आप l_amt = 64 . के साथ छोटे चंक आकार का उपयोग कर सकते हैं , और लाइन ब्रेक को छोड़ दें:

   FOR i IN 0 .. TRUNC((DBMS_LOB.getlength(ac_input) - 1 )/(l_amt + 2)) LOOP
      DBMS_LOB.read(ac_input, l_amt, l_offset, l_temp);
      l_offset := l_offset + l_amt + 2;

लेकिन एक नए l_clob के माध्यम से, उन सभी को एक बार में अलग करना शायद आसान और अधिक कुशल है चर:

create or replace 
function F_DECRYPT_CLOB (ac_input IN CLOB) return CLOB is 
  lb_variable CLOB; 
  l_clob CLOB;
  l_blob BLOB;
  ... 
begin 
   ...
    dbms_lob.createtemporary(l_blob, true);

   l_clob := replace(replace(ac_input, chr(13), null), chr(10), null);

   FOR i IN 0 .. TRUNC((DBMS_LOB.getlength(l_clob) - 1 )/l_amt) LOOP
      DBMS_LOB.read(l_clob, l_amt, l_offset, l_temp);
      l_offset := l_offset + l_amt;
      l_raw    := UTL_ENCODE.base64_decode(utl_raw.cast_to_raw(l_temp));
      DBMS_LOB.append (l_blob, TO_BLOB(l_raw));
    END LOOP; 
   ...    
end F_DECRYPT_CLOB;
/

पूरी तरह से:

create or replace 
function F_DECRYPT_CLOB (ac_input IN CLOB) return CLOB is 
  lb_variable CLOB; 
  l_clob CLOB;
  l_blob BLOB;
  v_key RAW (320);
  v_encryption_type PLS_INTEGER := DBMS_CRYPTO.AES_CBC_PKCS5;
  v_iv RAW (320);
  l_dest_offset  PLS_INTEGER := 1;
  l_src_offset   PLS_INTEGER := 1;
  l_lang_context PLS_INTEGER := DBMS_LOB.default_lang_ctx;
  l_warning      PLS_INTEGER;

  l_raw     RAW(32767);
  l_amt     NUMBER := 7700;
  l_offset  NUMBER := 1;
  l_temp    VARCHAR2(32767);
  l_step PLS_INTEGER := 7700;

begin 
    SELECT VALUE
     INTO v_key
     FROM algparameters
    WHERE name = 'key';
   SELECT VALUE
     INTO v_iv
     FROM algparameters
    WHERE name = 'iv';

    dbms_lob.createtemporary(l_blob, true);

   l_clob := replace(replace(ac_input, chr(13), null), chr(10), null);

   FOR i IN 0 .. TRUNC((DBMS_LOB.getlength(l_clob) - 1 )/l_amt) LOOP
      DBMS_LOB.read(l_clob, l_amt, l_offset, l_temp);
      l_offset := l_offset + l_amt;
      l_raw    := UTL_ENCODE.base64_decode(utl_raw.cast_to_raw(l_temp));
      DBMS_LOB.append (l_blob, TO_BLOB(l_raw));
    END LOOP; 

  dbms_lob.createtemporary(lb_variable, true);

 sys.DBMS_CRYPTO.DECRYPT( 
                 dst => lb_variable, 
                 src => l_blob, 
                 typ => v_encryption_type,--dbms_crypto.des_cbc_pkcs5, 
                 key => v_key,
                 iv => v_iv
                 ); 

   return lb_variable; 
end F_DECRYPT_CLOB;
/



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle:पैकेज के अंदर संग्रहीत कार्यविधि को कॉल करें

  2. Oracle में दो टाइमस्टैम्प के बीच अंतर की गणना कैसे करें

  3. एक संग्रहित खरीद चलाने के लिए हाइबरनेट 4 में देशी ओरेकल कनेक्शन के लिए एक हैंडल प्राप्त करना

  4. डॉकर ओरेकल इंस्टेंट क्लाइंट

  5. .NET से पैरामीटर के साथ Oracle संग्रहीत कार्यविधि को कॉल करने के लिए उचित odbc कमांड क्या है?