如何用PL/SQL将表中CLOB文本打包为tar.gz并通过UTL_HTTP发送?
在PL/SQL中生成有效TAR包的可行方案
针对你遇到的问题,这里提供几个无需自行实现TAR算法的替代方案:
调用操作系统TAR命令(需服务器权限)
如果数据库服务器允许执行外部命令,这是最直接的方案:- 创建数据库目录对象并授权读写权限:
CREATE OR REPLACE DIRECTORY TEMP_FILE_DIR AS '/path/to/secure/temp'; GRANT READ, WRITE ON DIRECTORY TEMP_FILE_DIR TO your_db_user; - 遍历
my_table,用DBMS_LOB将每个CLOB内容写入临时目录下对应文件名的文件:DECLARE v_clob CLOB; v_filename VARCHAR2(100); v_file UTL_FILE.FILE_TYPE; v_offset NUMBER := 1; v_amount NUMBER := 32767; v_buffer VARCHAR2(32767); BEGIN FOR rec IN (SELECT content, filename FROM my_table) LOOP v_clob := rec.content; v_filename := rec.filename; v_file := UTL_FILE.FOPEN('TEMP_FILE_DIR', v_filename, 'W', 32767); WHILE v_offset <= DBMS_LOB.GETLENGTH(v_clob) LOOP DBMS_LOB.READ(v_clob, v_amount, v_offset, v_buffer); UTL_FILE.PUT(v_file, v_buffer); UTL_FILE.FFLUSH(v_file); v_offset := v_offset + v_amount; END LOOP; UTL_FILE.FCLOSE(v_file); v_offset := 1; END LOOP; END; / - 通过
DBMS_SCHEDULER或UTL_SYSCMD执行系统TAR命令打包:BEGIN DBMS_SCHEDULER.CREATE_JOB( job_name => 'PACK_TAR_GZ', job_type => 'EXECUTABLE', job_action => '/bin/tar -czf /path/to/secure/temp/output.tar.gz -C /path/to/secure/temp .', enabled => TRUE, auto_drop => TRUE ); END; / - 将生成的tar.gz文件读取为BLOB,再用
UTL_HTTP发送。
- 创建数据库目录对象并授权读写权限:
使用Java存储过程调用成熟TAR库
利用Java的开源TAR工具(如Apache Commons Compress)实现打包,再通过PL/SQL调用:- 编写Java类,实现从CLOB列表生成TAR字节流的逻辑,将字节流转为BLOB返回。
- 将Java类编译后加载到Oracle数据库,创建PL/SQL包装过程。
- 在PL/SQL中调用该包装过程,获取TAR格式的BLOB,后续压缩并发送。
内容的提问来源于stack exchange,提问作者donvogel
相关产品推荐
相关产品推荐

