Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Problem decoding base 64 CLOB

sKrJan 14 2013 — edited Jan 14 2013
Hi all.

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
"CORE 11.2.0.1.0 Production"
TNS for HPUX: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

I have a problem while decoding base 64 data when my data exceeds 32767, I have this example:

table creation
CREATE TABLE prueba_clob (id NUMBER,columna CLOB);
Insert sample data 'aaaaa':
DECLARE
	v_clob CLOB;
	v_varchar VARCHAR2(32767);
BEGIN
	dbms_lob.createtemporary(v_clob, true);
	v_varchar := RPAD('a',32767,'a');
	FOR i IN 1..2 LOOP
		DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_varchar),v_varchar);
	END LOOP;
	INSERT INTO prueba_clob VALUES (1,v_clob);
END;
/
Function for encoding and decoding:
CREATE OR REPLACE FUNCTION fn_codificar_64
(
	p_entrada		IN CLOB,
	p_codificar		IN NUMBER
)
RETURN CLOB IS
	v_entrada CLOB;
	v_salida CLOB;
	v_tamanio NUMBER;
	v_posicion NUMBER := 1;
	v_buffer_cod VARCHAR2(32767);
	v_buffer_dec VARCHAR2(32767);
	v_cantidad_cod NUMBER := 57;
	v_cantidad_dec NUMBER := 32767;
BEGIN
	v_entrada := p_entrada;
	v_tamanio := LENGTH(v_entrada);
	dbms_lob.createtemporary(v_salida, true);
	
	--When Encoding
	IF p_codificar = 1 THEN
		WHILE v_posicion <= v_tamanio LOOP
			DBMS_LOB.READ(v_entrada,v_cantidad_cod,v_posicion,v_buffer_dec);
			v_buffer_cod := UTL_ENCODE.TEXT_ENCODE(v_buffer_dec, ENCODING => UTL_ENCODE.BASE64);
			v_posicion := v_posicion + v_cantidad_cod;
			v_salida := v_salida||v_buffer_cod;
			v_buffer_dec := null;
			v_buffer_cod := null;
		END LOOP;
	--When Decoding
	ELSIF p_codificar = 0 THEN
		WHILE v_posicion <= v_tamanio LOOP
			DBMS_LOB.READ(v_entrada,v_cantidad_dec,v_posicion,v_buffer_cod);
			v_buffer_dec := UTL_ENCODE.TEXT_DECODE(v_buffer_cod, ENCODING => UTL_ENCODE.BASE64);
			v_posicion := v_posicion + v_cantidad_dec;
			DBMS_LOB.WRITEAPPEND(v_salida, LENGTH(v_buffer_dec),v_buffer_dec);
			v_buffer_dec := null;
			v_buffer_cod := null;
		END LOOP;
	END IF;
	RETURN v_salida;
END fn_codificar_64;
/
Insertion of encoded data:
DECLARE
	v_clob CLOB;
BEGIN
	SELECT fn_codificar_64(columna,1)
	INTO v_clob
	FROM prueba_clob;
	
	INSERT INTO prueba_clob VALUES(2,v_clob);
END;
/
Final results:
SELECT fn_codificar_64(columna,0)
FROM prueba_clob
WHERE id = 2;

aaaaaa�����
As you can see only the first part is correctly decoded, after that we only have �����

The data is correctly encoded you can use this link to check: http://redir.dasumo.com/hex/

When encoding, I use chunks of 57 bytes because I read that when using that amount you can place as many chunks as you need and it works, but when decoding I don't know the correct amount.

Thanks.

Regards.
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Feb 11 2013
Added on Jan 14 2013
6 comments
954 views