======Oracle Text für die Verarbeitung von Binären Dokumenten in PL/SQL verwenden=====
Einführung in Oracle Text => [[dba:oracle_text|Oracle Text - Volltext Suche über Text Dokumente]]
Neben der Hauptfunktion der Volltext Suche können die Oracle Text Feature auch in PL/SQL für das Arbeiten mit Binären Dokumente verwendet werden.
Zum Beispiel einen Vorschauansicht eines binären Dokumentes wie MS Word in Oracle Apex darzustellen oder binäre Daten auszulesen und zu verarbeiten.
Dazu kann sehr gut das [[https://docs.oracle.com/database/121/CCREF/cdocpkg.htm|CTX_DOC Package]] eingesetzt werden.
===Ein erstes Beispiel===
Eine Filter Regel anlegen wie das Dokument verarbeitet werden soll:
begin
-- create the policy for this example
ctx_ddl.create_preference(preference_name => 'fast_filter'
, object_name => 'AUTO_FILTER');
ctx_ddl.set_attribute(preference_name => 'fast_filter'
, attribute_name => 'OUTPUT_FORMATTING'
, attribute_value => 'FALSE');
ctx_ddl.create_policy(policy_name => 'GPI_FAST_POLICY'
, filter => 'fast_filter');
end;
/
Das Dokument lesen und verarbeiten, hier aus einen BFILE, das eigentliche Dokument liegt auf der Platte und wird mit den obigen Filtereinstellung in ein HTML Dokument gewandelt.
-- read the data and classify
declare
-- The id of the test document
v_doc_id number:=5541;
v_doc_text clob;
v_file_doc bfile;
v_blob_doc blob;
v_amount integer := 32767;
v_position integer := 1;
v_buffer raw(32767);
begin
-- read the bfile from the database
select filepointer
into v_file_doc
from documents
where id = v_doc_id;
-- create a temporary CLOB to hold the document text
dbms_lob.createtemporary(v_blob_doc, true, dbms_lob.session);
-- read the bfile to the blob
dbms_lob.open(v_file_doc, dbms_lob.lob_readonly);
loop
begin
dbms_lob.read(v_file_doc, v_amount, v_position, v_buffer);
exception
when no_data_found then
exit;
end;
dbms_lob.writeappend(v_blob_doc, v_amount, v_buffer);
v_position := v_position + v_amount;
end loop;
dbms_lob.close(v_file_doc);
--
-- call ctx_doc.policy_filter to filter the BLOB to CLOB data
--
ctx_doc.policy_filter('GPI_FAST_POLICY', v_blob_doc, v_doc_text, false);
-- Do now something with the pure TXT data of the document
--
dbms_output.put_line(substr(v_doc_text,1,4000));
--
--
--free the lob
dbms_lob.freetemporary(v_blob_doc);
end;
/