使用Oracle存储过程进行压缩

7

目前我正在使用Oracle实用程序过程UTL_COMPRESS.LZ_COMPRESS()对一些数据进行压缩。但问题是它使用GZIP兼容格式来压缩,不幸的是这也不兼容ZIP。因此,Windows XP本地解压缩实用程序无法打开它(你知道那个压缩文件夹)。用户必须使用其他实用程序,如7ZipWinzipFilzip等才能解压缩。

因此,我们制定了一个计划:从Oracle中检索GZIP数据,使用Java解压缩它,并将其再次压缩为ZIP(可以被Windows实用程序解压缩的东西)。这听起来很荒谬:压缩-in-gzip -> 解压缩 -> 再次压缩-in-zip

有什么办法可以一开始就以期望的格式压缩它,避免所有这些额外的计算吗?

3个回答

8
有一个Java包java.util.zip支持WinZip格式。在Oracle中,我们可以构建Java存储过程,以可调用本机PL/SQL程序的形式呈现Java类。了解更多信息
因此,您需要编写一个文件,其中包含未压缩状态的数据,然后通过JSP将其压缩。如果您不想编写自己的实现,请查看Vadim Loevski的这篇文章。它包括用于压缩OS文件的Java存储过程。
注意:在这个上下文中,JSP表示Java存储过程,它是嵌入数据库的Java程序。它与Java Server Pages不同,后者是一种Web技术,因此JSP首字母缩写的常见用法不同。对造成的任何困惑,我深表歉意。

JSP 不适用于此情况,因为所有内容都在数据库中。我的 PL/SQL 程序正在从一个表中检索未压缩的数据,并将压缩后的数据写入另一个表中。接下来它会删除所有这些未压缩的数据,以节省存储成本。 - Adeel Ansari
我也在考虑Java存储过程的事情。但是我以前从未做过任何一个例子,这让我有点担心可能性。听到你说类似的话后,给了我信心。现在,经过想出一个非常简单的例子,我认为这是正确的方法。非常感谢您的意见和宝贵资源链接。+1 - Adeel Ansari
关于您的编辑,"NB" 意思是 "Nota Bene",如果我没有再次弄错的话 ;) - Adeel Ansari
1
@AdeelAnsari - 对于另一个令人困惑的首字母缩写表示抱歉。我想我就是控制不住自己 :( - APC

3

as_zip博客文章)是一个原生的PL/SQL包,用于操作ZIP归档文件。
它能够处理高达4GB的文件(似乎是原始ZIP格式的限制)。
该包由Anton Scheffer编写,并采用MIT许可证。


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


抱歉,这是一个错误的复制/粘贴问题。UTL_COMPRESS和您提供的链接都说明压缩数据将与GZIP兼容。但我想要的是标准的ZIP格式。感谢指出错误。 - Adeel Ansari
那个链接已经失效了。 - zygimantus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接