2010-12-10 127 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許可的。