======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; /