코드가 좀 복잡하지만 성공적으로 실행되었다. 지금까지 설명한 MIME에 대한 추가된 내용과 파일처리에 대해 설명한 내용을 이해했다면 이번 예제코드를 이해할 때 큰 무리는 없을 것이다. 따라서 이번 예제코드 중 앞 부분에서 다루지 않은 내용에 대해서만 추가로 알아 보자.
• vf_file_buff :=
fn_get_raw_file (vv_directory, vv_filename);
UTL_FILE 패키지를 이용한 fn_get_raw_file 함수를 통해 파일 내용을
RAW 타입으로 반환해 vf_file_buff 변수에 넣고 있다.
• vn_file_len :=
DBMS_LOB.GETLENGTH(vf_file_buff);
DBMS_LOB 시스템 패키지의 GETLENGTH 함수를 사용해 vf_file_buff 변수의
크기를 알아냈다.
• WHILE vn_pos <
vn_file_len LOOP ~ END LOOP;
이진 데이터인 파일을 메일로 보내려면 문자형으로 변환해서 보내야 한다.
이를 위해 BASE64 인코딩을 해야 하는데 이는 UTL_ENCODE.BASE64_ENCODE 함수를 사용해 처리한다.
문제는 한 줄에 넣을 수 있는 최댓값이 76 바이트다. 따라서 76 바이트씩
끊어 입력하기 위해 WHILE문을 사용한 것이다. 그런데 이를 위해 사용한
vn_base64_max_len 변수 값을 54로 설정한 이유는 뭘까? 실제로 데이터를
끊는 부분의 코드는 vf_temp_buff := UTL_RAW.SUBSTR (
vf_file_buff, vn_pos, vn_divide); 이다. UTL_RAW 시스템
패키지의 SUBSTR 함수를 사용하고 있는데, vf_file_buff를 vn_pos부터
vn_divide 까지 잘라내 반환하라는 의미다. vn_divide는
vn_base64_max_len 값과 같이 54이며 결국 데이터를 76이 아닌 54
바이트씩 끊고 있다. 이렇게 하는 이유는 보통 BASE64 인코딩을 하면
인코딩된 데이터는 대략 원본 데이터의 (¾)만큼 커진다. 따라서 76 *
(¾) = 54 바이트씩 끊어 이 결과를 BASE64 인코딩한 뒤 입력한 것이다.