2010-12-10 129 views
7

现在我正在使用Oracle实用程序UTL_COMPRESS.LZ_COMPRESS()来压缩一些数据。但问题在于它使用兼容GZIP的格式压缩了这种格式,但不幸的是这种格式不兼容ZIP。因此,Windows XP本地解压缩实用程序无法打开它(您知道压缩文件夹thingie)。用户必须使用其他一些实用程序,例如7ZipWinzipFilzip等,以便对其进行解压缩。因此,我们最终制定了从Oracle检索GZIP数据的计划,使用Java对其进行解压缩,然后将其压缩回ZIP(可由Windows实用程序解压的东西)。这听起来很可笑compress-in-gzip -> decompress -> compress-again-in-zip使用Oracle存储过程的压缩

任何想法我们如何可以首先压缩它在理想的格式,以避免所有这些额外的计算?

回答

8

有一个支持WinZip格式的Java包java.util.zip。而在Oracle中,我们可以构建java存储过程,以可以由本机PL/SQL程序调用的形式呈现Java类。 Find out more

因此,你需要做的是写出一个包含处于未压缩状态的数据的文件,然后通过JSP将其提供给它进行压缩。如果您不想编写自己的实现,请检查this article by Vadim Loevski。它包含一个用于压缩操作系统文件的Java存储过程。


注意:在此上下文中,JSP表示Java存储过程,它是嵌入在数据库中的Java程序。它不同于Java服务器页面,它是一种Web技术,因此JSP缩写词更常见。对于给出的任何混淆,我表示歉意。

+0

JSP不存在问题,因为数据库中的所有内容都存在。我的PL/SQL过程从一个表中检索未压缩的数据并将压缩数据写入另一个表。在下一步中,删除所有这些未压缩的数据,以节省存储成本。 – 2010-12-10 07:12:29

+0

我在想这个,我的意思是关于Java存储过程。但是我从来没有做过一个例子,这让我有点担心这种可能性。听到你的类似事情后,它给了我信心。现在想出一个非常简单的例子,我认为这是一条路。非常感谢您的意见和宝贵资源的链接。 +1 – 2010-12-10 08:47:10

3

UTL_RAW.CAST_TO_RAW不是任何种类的压缩算法。不知道你在哪里提出这个想法。 RAW(及其较大的表兄弟BLOB)只是存储不是数字,日期或字符串的数据。您不希望将二进制数据存储在字符串中,因为存在字符转换问题的可能性。

用于压缩的正确PL/SQL包是UTL_COMPRESS,它使用标准的Lempel-Ziv算法。

http://download.oracle.com/docs/cd/E11882_01/appdev.112/e16760/u_compr.htm#BGBBCDDI

3

as_zipblog post)是天然PL/SQL程序包来操纵ZIP压缩文件。
它处理高达4千兆字节的文件(看起来像原始ZIP格式的限制)。
该软件包由Anton Scheffer编写,并且是MIT许可的。