I Oracle 12c og fremefter, hvor Oracle Apex er installeret som standard, kan du bruge APEX_ZIP
PL/SQL-pakke til at zippe filerne. Så her giver jeg et par Oracle APEX_ZIP
eksempler:
Oracle APEX_ZIP-eksempel
Følgende PL/SQL-kode henter filerne (BLOB
) fra en tabel og zip den, og giver dig en sidste BLOB
der har alle de filer, du har tilføjet.
declare b_zip_file blob; cursor c_files is select file_name, file_content from emp_files where empno = 7894; begin for c in c_files loop -- adds the each blob to b_zip_file blob one by one apex_zip.add_file ( p_zipped_blob => b_zip_file, p_file_name => c.file_name, p_content => c.file_content ); end loop; -- finalizes the blob apex_zip.finish ( p_zipped_blob => b_zip_file ); end;
Du kan se i ovenstående kode, at du til sidst får den endelige BLOB
som du yderligere kan gemme i tabellen eller sende den til en procedure eller skrive en fil på serveren.
Følgende eksempel er en tilføjelse til ovenstående kode. Efter at have zippet filerne, vil den skrive zip-filen til serveren.
Zip filer ved hjælp af APEX_ZIP-pakken og skriv til serveren
For at skrive filen på serveren skal du bruge et Oracle Directory-objekt. Nedenfor er et eksempel, hvordan man opretter et biblioteksobjekt i Oracle, der peger på et bibliotek på serveren.
Create or Replace directory my_dir as '/your/server/path';
Efter at have oprettet mappen, kan du skrive zip-filen som vist i nedenstående eksempel:
declare b_zip_file blob; -- variables for writing the files l_file UTL_FILE.file_type; l_buffer RAW (32767); l_amount BINARY_INTEGER := 32767; l_pos INTEGER := 1; l_blob_len INTEGER; -- end variable declaration for file cursor c_files is select file_name, file_content from emp_files where empno = 7894; begin for c in c_files loop -- adds the each blob to b_zip_file blob one by one apex_zip.add_file ( p_zipped_blob => b_zip_file, p_file_name => c.file_name, p_content => c.file_content ); end loop; -- finalizes the blob apex_zip.finish ( p_zipped_blob => b_zip_file ); -- write the file l_blob_len := DBMS_LOB.getlength (b_zip_file); l_file := UTL_FILE.fopen ('MY_DIR', 'my_zip.zip', 'WB', 32767); WHILE l_pos < l_blob_len LOOP DBMS_LOB.read (b_zip_file, l_amount, l_pos, l_buffer); UTL_FILE.put_raw (l_file, l_buffer, TRUE); l_pos := l_pos + l_amount; END LOOP; UTL_FILE.fclose (l_file); end;
Efter at have kørt ovenstående PL/SQL-kode, vil du finde filen my_zip.zip
ved MY_DIR
mappeplacering på serveren.
Relaterede selvstudier:
- Hvordan får man BLOB fra fil i PL/SQL?
- Hvordan UNZIP en fil i PL/SQL?
Reference:
- APEX_ZIP Oracle Manual