This post gives some helpful queries when working on FND Attachment tables. I have also given a sample program to extract these attachment into file system.
Attachment Types are stored in the fnd_document_datatypes table.
select * from fnd_document_datatypes;
Query to retrieve the 'Short Text' Attachments:
Query to retrieve the 'Long Text' Attachments:
Query to retrieve the 'File' Attachments:
Query to retrieve the 'Web Page' Attachments:
Sample program to extract the attachments into file system.
Note: The oracle directory object 'XX_EXTRACT_DIR' should be created before running the script. Refer the below blog to see how to use utl_file package.
Johny's Oracle Tips: PL/SQL: Sample code for UTL_FILE
Feel free to point out if anything is missing/wrong in this blog.
Attachment Types are stored in the fnd_document_datatypes table.
select * from fnd_document_datatypes;
Query to retrieve the 'Short Text' Attachments:
select
fad.document_id
,fad.entity_name
,fad.pk1_value
,fad.pk2_value
,fdct.user_name
"Category"
,fdd.user_name
"Type"
,fds.short_text
,(fad.entity_name ||
'_'
|| fad.document_id ||
'_ST.txt'
) file_name
from
fnd_attached_documents fad
,fnd_documents fd
,fnd_documents_short_text fds
,fnd_document_datatypes fdd
,fnd_document_categories_tl fdct
where
fad.document_id = fd.document_id
and
fd.media_id = fds.media_id
and
fd.datatype_id = fdd.datatype_id
and
fd.category_id = fdct.category_id
and
fdd.user_name =
'Short Text'
and
fad.entity_name =
:p_entity_name
-- replace with the entity_name you want to extract.
order
by
fad.pk1_value, pk2_value;
Query to retrieve the 'Long Text' Attachments:
select
fad.entity_name
,fad.document_id
,fad.pk1_value
,fad.pk2_value
,fdct.user_name
"Category"
,fdd.user_name
"Type"
,fdl.long_text
,(fad.entity_name ||
'_'
|| fad.document_id ||
'_LT.txt'
) file_name
from
fnd_attached_documents fad
,fnd_documents fd
,fnd_documents_long_text fdl
,fnd_document_datatypes fdd
,fnd_document_categories_tl fdct
where
fad.document_id = fd.document_id
and
fd.media_id = fdl.media_id
and
fd.datatype_id = fdd.datatype_id
and
fd.category_id = fdct.category_id
and
fdd.user_name =
'Long Text'
and
fad.entity_name =
:p_entity_name
-- replace with the entity_name you want to extract.
order
by
fad.pk1_value, pk2_value;
Query to retrieve the 'File' Attachments:
select
fad.entity_name
,fad.document_id
,fad.pk1_value
,fad.pk2_value
,fdct.user_name
"Category"
,fdd.user_name
"Type"
,fd.datatype_id
,(fad.entity_name ||
'_'
|| fad.document_id ||
'_'
|| fl.file_name) file_name
,fl.file_data
from
fnd_attached_documents fad
,fnd_documents fd
,fnd_lobs fl
,fnd_document_datatypes fdd
,fnd_document_categories_tl fdct
where
fad.document_id = fd.document_id
and
fd.media_id = fl.file_id
and
fd.datatype_id = fdd.datatype_id
and
fd.category_id = fdct.category_id
and
fdd.user_name =
'File'
and
fad.entity_name =
:p_entity_name
-- replace with the entity_name you want to extract
.
order
by
fad.pk1_value, pk2_value;
Query to retrieve the 'Web Page' Attachments:
select
fad.entity_name
,fad.document_id
,fad.pk1_value
,fad.pk2_value
,fdct.user_name
"Category"
,fdd.user_name
"Type"
,(fad.entity_name ||
'_'
|| fad.document_id ||
'_URL.txt'
) file_name
,fd.url
from
fnd_attached_documents fad
,fnd_documents fd
,fnd_document_datatypes fdd
,fnd_document_categories_tl fdct
where
fad.document_id = fd.document_id
and
fd.datatype_id = fdd.datatype_id
and
fd.category_id = fdct.category_id
and
fdd.user_name =
'Web Page'
and
fad.entity_name =
:p_entity_name
-- replace with the entity_name you want to extract.
order
by
fad.pk1_value, pk2_value;
Sample program to extract the attachments into file system.
declare
v_file utl_file.file_type;
v_line
varchar2
(
1000
);
v_blob_len
number
;
v_pos
number
;
v_buffer
raw
(
32764
);
v_amt binary_integer :=
32764
;
cursor
cur_short_text_files
is
select
fad.entity_name
,fad.document_id
,fad.pk1_value
,fad.pk2_value
,fds.short_text
,(fad.entity_name ||
'_'
|| fad.document_id ||
'_ST.txt'
) file_name
from
fnd_attached_documents fad
,fnd_documents fd
,fnd_documents_short_text fds
,fnd_document_datatypes fdd
where
fad.document_id = fd.document_id
and
fd.media_id = fds.media_id
and
fd.datatype_id = fdd.datatype_id
and
fdd.user_name =
'Short Text'
and
fad.entity_name =
:p_entity_name
-- replace with the entity_name you want to extract.
order
by
fad.pk1_value, pk2_value;
cursor
cur_long_text_files
is
select
fad.entity_name
,fad.document_id
,fad.pk1_value
,fad.pk2_value
,fdl.long_text
,(fad.entity_name ||
'_'
|| fad.document_id ||
'_LT.txt'
) file_name
from
fnd_attached_documents fad
,fnd_documents fd
,fnd_documents_long_text fdl
,fnd_document_datatypes fdd
where
fad.document_id = fd.document_id
and
fd.media_id = fdl.media_id
and
fd.datatype_id = fdd.datatype_id
and
fdd.user_name =
'Long Text'
and
fad.entity_name =
:p_entity_name
-- replace with the entity_name you want to extract.
order
by
fad.pk1_value, pk2_value;
cursor
cur_files
is
select
fad.entity_name
,fad.document_id
,fad.pk1_value
,fad.pk2_value
,fd.datatype_id
,(fad.entity_name ||
'_'
|| fad.document_id ||
'_'
|| fl.file_name) file_name
,fl.file_data
from
fnd_attached_documents fad
,fnd_documents fd
,fnd_lobs fl
,fnd_document_datatypes fdd
where
fad.document_id = fd.document_id
and
fd.media_id = fl.file_id
and
fd.datatype_id = fdd.datatype_id
and
fdd.user_name =
'File'
and
fad.entity_name =
:p_entity_name
-- replace with the entity_name you want to extract.
order
by
fad.pk1_value, pk2_value;
cursor
cur_url_files
is
select
fad.entity_name
,fad.document_id
,fad.pk1_value
,fad.pk2_value
,(fad.entity_name ||
'_'
|| fad.document_id ||
'_URL.txt'
) file_name
,fd.url
from
fnd_attached_documents fad
,fnd_documents fd
,fnd_document_datatypes fdd
where
fad.document_id = fd.document_id
and
fd.datatype_id = fdd.datatype_id
and
fdd.user_name =
'Web Page'
and
fad.entity_name =
:p_entity_name
-- replace with the entity_name you want to extract.
order
by
fad.pk1_value, pk2_value;
begin
-- Short Text Attachments
for
c_file
in
cur_short_text_files
loop
v_file := utl_file.fopen(
'XX_EXTRACT_DIR'
,c_file.file_name,
'W'
,
32764
);
utl_file.put(v_file,c_file.short_text);
utl_file.fclose(v_file);
end
loop
;
-- Long Text Attachments
for
c_file
in
cur_long_text_files
loop
v_file := utl_file.fopen(
'XX_EXTRACT_DIR'
,c_file.file_name,
'W'
,
32764
);
utl_file.put(v_file,c_file.long_text);
utl_file.fclose(v_file);
end
loop
;
-- File Attachments
for
c_file
in
cur_files
loop
v_file := utl_file.fopen(
'XX_EXTRACT_DIR'
,c_file.file_name,
'wb'
,
32764
);
v_blob_len := dbms_lob.getlength(c_file.file_data);
v_pos :=
1
;
while
v_pos < v_blob_len
loop
dbms_lob.
read
(c_file.file_data,v_amt,v_pos,v_buffer);
utl_file.put_raw(v_file,v_buffer,
true
);
v_pos := v_pos + v_amt;
end
loop
;
utl_file.fclose(v_file);
end
loop
;
--Web Page Attachments
for
c_file
in
cur_url_files
loop
v_file := utl_file.fopen(
'XX_EXTRACT_DIR'
,c_file.file_name,
'W'
,
32764
);
utl_file.put(v_file,c_file.url);
utl_file.fclose(v_file);
end
loop
;
end
;
Note: The oracle directory object 'XX_EXTRACT_DIR' should be created before running the script. Refer the below blog to see how to use utl_file package.
Johny's Oracle Tips: PL/SQL: Sample code for UTL_FILE
Feel free to point out if anything is missing/wrong in this blog.