APEX_ZIP : Manage Zip Files From PL/SQL
The APEX_ZIP package provides an API to manage zip files from PL/SQL.
oracle miscconfigurationintermediate
by OracleDba
14 views
The APEX_ZIP package provides an API to manage zip files from PL/SQL.
1234567891011121314151617181920
conn sys/SysPassword1@//localhost:1521/pdb1 as sysdba
create or replace directory tmp_dir as '/tmp/';
grant read, write on directory tmp_dir to testuser1;
conn testuser1/testuser1@//localhost:1521/pdb1
@https://oracle-base.com/dba/miscellaneous/file_to_blob.sql
@https://oracle-base.com/dba/miscellaneous/blob_to_file.sql
# drop table media purge;
create table media (
id number generated always as identity,
content_type varchar2(100) not null,
file_name varchar2(100) not null,
content blob not null,
constraint media_pk primary key (id),
constraint media_uk unique (file_name)
);12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
set serveroutput on
declare
l_zip blob;
l_files apex_zip.t_files;
begin
dbms_lob.createtemporary(l_zip, false);
-- Load the zip file into a BLOB.
file_to_blob(p_blob => l_zip,
p_dir => 'TMP_DIR',
p_filename => 'test_file.zip');
-- Get the list of files.
l_files := apex_zip.get_files(p_zipped_blob => l_zip);
-- Loop through the files and list the names.
for i in 1 .. l_files.count loop
dbms_output.put_line(i || ' : ' || l_files(i));
end loop;
dbms_lob.freetemporary(l_zip);
exception
when others then
dbms_lob.freetemporary(l_zip);
raise;
end;
/
1 : clone/multitenant-clone-2.png
2 : clone/multitenant-create-from-seed-2.png
3 : clone/multitenant-remote-clone-2.png
4 : unplug/multitenant-unplug-plug-2.png
PL/SQL procedure successfully completed.
SQL>
set serveroutput on
declare
l_zip blob;
l_files apex_zip.t_files;
begin
dbms_lob.createtemporary(l_zip, false);
-- Load the zip file into a BLOB.
file_to_blob(p_blob => l_zip,
p_dir => 'TMP_DIR',
p_filename => 'test_file.zip');
-- Get the list of files.
l_files := apex_zip.get_files(p_zipped_blob => l_zip,
p_only_files => false
);
-- Loop through the files and list the names.
for i in 1 .. l_files.count loop
dbms_output.put_line(i || ' : ' || l_files(i));
end loop;
dbms_lob.freetemporary(l_zip);
exception
when others then
dbms_lob.freetemporary(l_zip);
raise;
end;
/
1 : clone/
2 : clone/multitenant-clone-2.png
3 : clone/multitenant-create-from-seed-2.png
4 : clone/multitenant-remote-clone-2.png
5 : empty_dir/
6 : unplug/
7 : unplug/multitenant-unplug-plug-2.png
PL/SQL procedure successfully completed.
SQL>1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
select count(*) from media;
COUNT(*)
----------
0
SQL>
declare
l_zip blob;
l_files apex_zip.t_files;
l_file blob;
begin
dbms_lob.createtemporary(l_zip, false);
-- Load the zip file into a BLOB.
file_to_blob(p_blob => l_zip,
p_dir => 'TMP_DIR',
p_filename => 'test_file.zip');
-- Get the list of files.
l_files := apex_zip.get_files(p_zipped_blob => l_zip);
-- Loop through the files and list the names.
for i in 1 .. l_files.count loop
l_file := apex_zip.get_file_content(p_zipped_blob => l_zip,
p_file_name => l_files(i));
insert into media (content_type, file_name, content)
values ('image/png', l_files(i), l_file);
end loop;
commit;
dbms_lob.freetemporary(l_zip);
exception
when others then
dbms_lob.freetemporary(l_zip);
raise;
end;
/
column file_name format a40
select id, file_name, length(content) as content_length
from media;
ID FILE_NAME CONTENT_LENGTH
---------- ---------------------------------------- --------------
1 clone/multitenant-clone-2.png 7614
2 clone/multitenant-create-from-seed-2.png 7222
3 clone/multitenant-remote-clone-2.png 6192
4 unplug/multitenant-unplug-plug-2.png 6996
SQL>12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
declare
l_zip blob;
begin
-- Add the file to a new zip.
for cur_rec in (select file_name,
content
from media)
loop
apex_zip.add_file(p_zipped_blob => l_zip,
p_file_name => cur_rec.file_name,
p_content => cur_rec.content);
end loop;
-- Close the zip file.
apex_zip.finish(p_zipped_blob => l_zip);
-- Write the file to the file system.
blob_to_file(p_blob => l_zip,
p_dir => 'TMP_DIR',
p_filename => 'test_file_2.zip');
end;
/
set serveroutput on
declare
l_zip blob;
l_files apex_zip.t_files;
begin
dbms_lob.createtemporary(l_zip, false);
-- Load the zip file into a BLOB.
file_to_blob(p_blob => l_zip,
p_dir => 'TMP_DIR',
p_filename => 'test_file_2.zip');
-- Get the list of files.
l_files := apex_zip.get_files(p_zipped_blob => l_zip);
-- Loop through the files and list the names.
for i in 1 .. l_files.count loop
dbms_output.put_line(i || ' : ' || l_files(i));
end loop;
dbms_lob.freetemporary(l_zip);
exception
when others then
dbms_lob.freetemporary(l_zip);
raise;
end;
/
1 : clone/multitenant-clone-2.png
2 : clone/multitenant-create-from-seed-2.png
3 : clone/multitenant-remote-clone-2.png
4 : unplug/multitenant-unplug-plug-2.png
PL/SQL procedure successfully completed.
SQL>Please to add comments
No comments yet. Be the first to comment!