<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Oracle and Linux feed the dogs</title>
	<atom:link href="http://www.oracletool.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.oracletool.com/blog</link>
	<description>Bad advice and untested code, by Adam vonNieda</description>
	<lastBuildDate>Mon, 25 Feb 2013 17:24:15 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Quick and dirty script for making cold backups of KVM Virtual Machines</title>
		<link>http://www.oracletool.com/blog/quick-and-dirty-script-for-making-cold-backups-of-kvm-virtual-machines/</link>
		<comments>http://www.oracletool.com/blog/quick-and-dirty-script-for-making-cold-backups-of-kvm-virtual-machines/#comments</comments>
		<pubDate>Thu, 10 May 2012 16:03:40 +0000</pubDate>
		<dc:creator>Adam vonNieda</dc:creator>
				<category><![CDATA[Linux Systems Administration]]></category>
		<category><![CDATA[KVM]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Shell Scripting]]></category>
		<category><![CDATA[Systems Administration]]></category>
		<category><![CDATA[Virtualization]]></category>

		<guid isPermaLink="false">http://www.oracletool.com/blog/?p=113</guid>
		<description><![CDATA[Note that this depends on &#8220;virsh&#8221;, the libvirt client, and &#8220;bzip2&#8243;. Basically, what this script does is send a shutdown signal to each of the specified nodes, back up the disk images, and then bzip them in the background while &#8230; <a href="http://www.oracletool.com/blog/quick-and-dirty-script-for-making-cold-backups-of-kvm-virtual-machines/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Note that this depends on &#8220;virsh&#8221;, the libvirt client, and &#8220;bzip2&#8243;.</p>
<p>Basically, what this script does is send a shutdown signal to each of the specified nodes, back up the disk images, and then bzip them in the background while it restarts the node. So having said this, you&#8217;ll want to make sure your services on your VM&#8217;s are set to shut down and start up gracefully when the OS is shut down / restarted.</p>
<p><pre><code>

#!/bin/bash

#
# This is who we&#039;ll back up
#
machines=&quot;Dev Test Foobar&quot;

#
# Keep the house clean
#
days_to_keep=&quot;7&quot;

#
# Store backups here. NFS to another machine would make sense. 
# so that your backups are not local.
#
backup_dir=&quot;/VirtualMachines/KVM/backups&quot;

#
# Logs go here.
#
log_dir=&quot;/VirtualMachines/KVM/backups/logs&quot;

#
# End parameters
#
#=================================================================

#
# Timestamp for the log file
#
right_now=`date &#039;+%m%d%Y_%H%M%p&#039;`

exec 1&gt;/${log_dir}/backup_vms.${right_now}.log 2&gt;&amp;1

print_date() {
&nbsp;&nbsp; date &#039;+%m%d%Y_%H%M%p&#039;
}

for machine in $machines
do
&nbsp;&nbsp; if [[ ! -d ${backup_dir}/${machine} ]];
&nbsp;&nbsp; then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mkdir -p ${backup_dir}/${machine}
&nbsp;&nbsp; fi

&nbsp;&nbsp; echo &quot;Backing up VM configuration&quot;
&nbsp;&nbsp; virsh dumpxml $machine &gt; ${backup_dir}/${machine}/${machine}.xml

&nbsp;&nbsp; echo &quot;Sending shutdown signal to $machine&quot;
&nbsp;&nbsp; virsh shutdown $machine
&nbsp;&nbsp; echo &quot;&nbsp;&nbsp; Return code: $?&quot;
&nbsp;&nbsp; 
&nbsp;&nbsp; echo -n &quot;Waiting for machine to shut down &quot;
&nbsp;&nbsp; for i in 1 2 3 4 5
&nbsp;&nbsp; do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo -n &quot;.&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;virsh list | grep -v &quot;^$&quot; | grep -v &quot;^ Id&quot; | grep -v &quot;\-\-\-\-\-&quot; | awk &#039;{print $2&quot; &quot;$3}&#039; | grep $machine | while read name state
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if [[ $state -eq &quot;running&quot; ]]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep 60
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fi
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;done
&nbsp;&nbsp; done

&nbsp;&nbsp; echo &quot;Copying disk(s)&quot;
&nbsp;&nbsp; virsh domblklist $machine | grep -v &quot;^$&quot; | grep -v &quot;^Target&quot; | grep -v &quot;\-\-\-\-\-&quot; | awk &#039;{print $2}&#039; | while read disk
&nbsp;&nbsp; do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;&nbsp;&nbsp; $disk ...&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;copy_disk=&quot;${backup_dir}/${machine}/`basename ${disk}`.`print_date`&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;&nbsp;&nbsp; Copying $disk to $copy_disk&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fuser $disk 1&gt;/dev/null 2&gt;&amp;1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (( $? == 0 ))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo &quot;&nbsp;&nbsp; Disk $disk is still in use! &quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo &quot;&nbsp;&nbsp; Copy started at `print_date`&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cp $disk $copy_disk
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo &quot;&nbsp;&nbsp; Return code: $?&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo &quot;&nbsp;&nbsp; Copy ended at `print_date`&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo &quot;&nbsp;&nbsp; Backgrounding bzip of $copy_disk&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nohup bzip2 $copy_disk &amp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi
&nbsp;&nbsp; done

&nbsp;&nbsp; echo &quot;Starting machine $machine&quot;
&nbsp;&nbsp; virsh start $machine
&nbsp;&nbsp; echo &quot;&nbsp;&nbsp; Return code: $?&quot;
&nbsp;&nbsp; echo

done

&nbsp;&nbsp; echo &quot;Removing old backups.&quot;
&nbsp;&nbsp; find $backup_dir -type f -mtime +$days_to_keep -ls
&nbsp;&nbsp; find $backup_dir -type f -mtime +$days_to_keep -exec rm -f {} \;

</code></pre></p>
]]></content:encoded>
			<wfw:commentRss>http://www.oracletool.com/blog/quick-and-dirty-script-for-making-cold-backups-of-kvm-virtual-machines/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Oracletool v3.0.0 released!</title>
		<link>http://www.oracletool.com/blog/oracletool-v3-0-0-released/</link>
		<comments>http://www.oracletool.com/blog/oracletool-v3-0-0-released/#comments</comments>
		<pubDate>Tue, 17 Apr 2012 14:10:17 +0000</pubDate>
		<dc:creator>Adam vonNieda</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.oracletool.com/blog/?p=104</guid>
		<description><![CDATA[News ===== Just a reminder that I no longer test Oracletool with Oracle versions < 11.1. All of the legacy HTML tags have been changed to use CSS rather than specifying style data using the old format. The size of &#8230; <a href="http://www.oracletool.com/blog/oracletool-v3-0-0-released/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p> News<br />
=====</p>
<p>   Just a reminder that I no longer test Oracletool with Oracle versions < 11.1.</p>
<p>   All of the legacy HTML tags have been changed to use CSS rather than specifying style data using the old format. The size of the oracletool.pl executable has decreased dramatically, and it looks better. Let me know if there are any pages that are formatted incorrectly, it&#8217;s entirely possible that I&#8217;ve missed something. </p>
<p>   ***************<br />
   * IMPORTANT!! *<br />
   ***************</p>
<p>   There are changes to the themes variables in the oracletool.sam file that need to be copied into your oracletool.ini file, or you can create a new one from the supplied oracletool.ini. If you don&#8217;t do this, your fonts may look very small. </p>
<p>   If you have a problem with font rendering, such as your fonts look very small, you may need to remove a browser cookie called &#8220;OracletoolProps&#8221;. Also, make sure you&#8217;ve made the changes to the themes in the oracletol.ini file. </p>
<p>Enhancements<br />
============</p>
<p>   Added a mechanism to search for the oracletool.ini config file on IIS web servers if it&#8217;s not in the same directory as Oracletool itself. Thanks to Praveen Hombaiah for the code change.</p>
<p>   Added an interface for viewing the alert log, under the DB Admin section (Finally!). This requires the creation of a procedure under the &#8220;SYS&#8221; schema. Please see the file get_alertlog_lines.sql under /sql for more information.  This also checks for &#8220;ORA-&#8221; messages in the lines displayed, and highlights them in a separate display.</p>
<p>   Added a preference setting for the number of lines of the alert log to display.</p>
<p>   Changed the displays of generated DDL to use textareas with scroll bars rather than just displaying the code. Much better for cutting and pasting. </p>
<p>Bug fixes<br />
=========</p>
<p>   Fixed a bug where when you select Session Info / Active and hit the refresh button, it would show all of the sessions. Thanks to Bryce Tutt for pointing it out. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.oracletool.com/blog/oracletool-v3-0-0-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scrape a value from a web page from within Oracle using utl_http</title>
		<link>http://www.oracletool.com/blog/scrape-a-value-from-a-web-page-from-within-oracle-using-utl_http/</link>
		<comments>http://www.oracletool.com/blog/scrape-a-value-from-a-web-page-from-within-oracle-using-utl_http/#comments</comments>
		<pubDate>Tue, 03 Apr 2012 18:32:04 +0000</pubDate>
		<dc:creator>Adam vonNieda</dc:creator>
				<category><![CDATA[Oracle Database Administration]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[PL/SQL]]></category>

		<guid isPermaLink="false">http://www.oracletool.com/blog/?p=100</guid>
		<description><![CDATA[Let&#8217;s say I want to get the current available version of Oracletool.. Create or replace procedure get_ot_version as &#160;&#160; req&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;UTL_HTTP.REQ; &#160;&#160; resp&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; UTL_HTTP.RESP; &#160;&#160; matchcount&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; number; &#160;&#160; string&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; varchar2(1024); &#160;&#160; version&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;varchar2(20); &#160;&#160; errmsg&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; varchar2(1000); Begin &#160;&#160; -- &#160;&#160; -- Set &#8230; <a href="http://www.oracletool.com/blog/scrape-a-value-from-a-web-page-from-within-oracle-using-utl_http/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>   Let&#8217;s say I want to get the current available version of Oracletool..</p>
<p><pre><code>
Create or replace procedure get_ot_version

as

&nbsp;&nbsp; req&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UTL_HTTP.REQ;
&nbsp;&nbsp; resp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UTL_HTTP.RESP;
&nbsp;&nbsp; matchcount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; number;
&nbsp;&nbsp; string&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; varchar2(1024);
&nbsp;&nbsp; version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar2(20);
&nbsp;&nbsp; errmsg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; varchar2(1000);

Begin
 
&nbsp;&nbsp; --
&nbsp;&nbsp; -- Set the proxy server, if needed.
&nbsp;&nbsp; -- 
&nbsp;&nbsp; --utl_http.set_proxy(&#039;http://192.168.1.10:8080&#039;);
&nbsp;&nbsp; --
&nbsp;&nbsp; -- Make the HTTP request
&nbsp;&nbsp; --
&nbsp;&nbsp; req := utl_http.begin_request(&#039;http://www.oracletool.com&#039;);
&nbsp;&nbsp; utl_http.set_header(req, &#039;User-Agent&#039;, &#039;Mozilla/4.0&#039;);
&nbsp;&nbsp; --
&nbsp;&nbsp; -- Loop through the response pieces
&nbsp;&nbsp; --
&nbsp;&nbsp; resp := utl_http.get_response(req);
&nbsp;&nbsp; loop
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;utl_http.read_line(resp, string, TRUE);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Look for a line with &quot;Latest version is&quot; in it, and parse out the version string.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Select instr(string,&#039;Latest version is&#039;) into matchcount from dual;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (matchcount &gt; 0) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select regexp_replace(string,&#039;.*Latest version is&amp;nbsp;&amp;nbsp;&#039;,&#039;&#039;) into string from dual;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select regexp_replace(string,&#039; - Released.*&#039;,&#039;&#039;) into version from dual;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbms_output.put_line(&#039;Version: &#039;||version);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end if;
&nbsp;&nbsp; end loop;
Exception
&nbsp;&nbsp; when utl_http.end_of_body then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;utl_http.end_response(resp);
&nbsp;&nbsp; when others then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errmsg := substr(sqlerrm,1,1000);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;Exception raised during page scrape! &#039;||errmsg);
End;
/
</code></pre></p>
<p>And then..</p>
<p>SQL> Set serveroutput on;<br />
SQL> Exec get_ot_version;<br />
Version: 2.3.3</p>
<p>PL/SQL procedure successfully completed.</p>
<p> <img src='http://www.oracletool.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.oracletool.com/blog/scrape-a-value-from-a-web-page-from-within-oracle-using-utl_http/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Procedure to get the alert log from within the database</title>
		<link>http://www.oracletool.com/blog/procedure-to-get-the-alert-log-from-within-the-database/</link>
		<comments>http://www.oracletool.com/blog/procedure-to-get-the-alert-log-from-within-the-database/#comments</comments>
		<pubDate>Thu, 22 Mar 2012 14:39:13 +0000</pubDate>
		<dc:creator>Adam vonNieda</dc:creator>
				<category><![CDATA[Oracle Database Administration]]></category>
		<category><![CDATA[Oracletool]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[PL/SQL]]></category>

		<guid isPermaLink="false">http://www.oracletool.com/blog/?p=86</guid>
		<description><![CDATA[Here&#8217;s a quick and easy procedure (if you&#8217;re on Oracle 11), to get the alert log from within the database. Because the alert log table (X$DBGALERTEXT) is an &#8220;X$&#8221;, you need to be SYSDBA in order to access it. So &#8230; <a href="http://www.oracletool.com/blog/procedure-to-get-the-alert-log-from-within-the-database/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>   Here&#8217;s a quick and easy procedure (if you&#8217;re on Oracle 11), to get the alert log from within the database. Because the alert log table (X$DBGALERTEXT) is an &#8220;X$&#8221;, you need to be SYSDBA in order to access it. So the best way to allow &#8220;normal&#8221; users access to it is to create a procedure. This will return a CLOB containing the lines of the alert log. This functionality will be included in Oracletool 2.3.4, btw. </p>
<p><pre><code>
Create or replace procedure get_alertlog_lines (num_lines in number, alertlog out clob)
/*
&nbsp;&nbsp; This procedure should be owned by SYS, and you should grant
&nbsp;&nbsp; execute privileges on it to whatever user you connect to your
&nbsp;&nbsp; database as within Oracletool.

&nbsp;&nbsp; Oracletool will not display the alertlog menu item unless this
&nbsp;&nbsp; procedure exists.
*/

as

&nbsp;&nbsp; v_alertlog clob;

Begin

&nbsp;&nbsp; For i in (
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Select
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; indx,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; to_char(originating_timestamp,&#039;MM/DD/YYYY HH24:MI:SS&#039;) as timestamp,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message_text as text
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from X$DBGALERTEXT
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where indx &gt; (Select max(indx)-num_lines from X$DBGALERTEXT) order by indx asc)
&nbsp;&nbsp; loop
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v_alertlog := v_alertlog||i.timestamp||&#039;: &#039;||i.text;
&nbsp;&nbsp; end loop;

&nbsp;&nbsp; alertlog := v_alertlog;

End get_alertlog_lines;
/

--
-- Example grant
--
Grant execute on get_alertlog_lines to ADAM;
</code></pre></p>
<p>  That&#8217;s it! let&#8217;s try it out via SQL*Plus! First thing I&#8217;m going to do is create a synonym for the procedure. </p>
<p><pre><code>
[oracle@mastiff /home/oracle] [DEMO]$ sqlplus adam/&lt;password&gt;

SQL*Plus: Release 11.2.0.3.0 Production on Thu Mar 22 09:25:30 2012
Copyright (c) 1982, 2011, Oracle.&nbsp;&nbsp;All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

09:25:30 SQL&gt; Set serveroutput on;
09:25:35 SQL&gt; Create synonym get_alertlog_lines for sys.get_alertlog_lines;

Synonym created.

09:25:43 SQL&gt; Declare
09:25:54 SQL&gt; alertlog_lines clob;
09:26:10 SQL&gt; Begin
09:26:14 SQL&gt;&nbsp;&nbsp;&nbsp;&nbsp;get_alertlog_lines(25,alertlog_lines);
09:26:38 SQL&gt;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(alertlog_lines);
09:26:54 SQL&gt; End;
09:26:55 SQL&gt; /
03/22/2012 03:51:08: Private strand flush not complete
03/22/2012 03:51:08: Current log# 2 seq# 3512 mem# 0:/apps/oracle/oradata/RMAN/onlinelog/o1_mf_2_5rg7qlfr_.log
03/22/2012 03:51:08: Current log# 2 seq# 3512 mem# 1:/apps/oracle/backup/flash_recovery_area/RMAN/onlinelog/o1_mf_2_5rg7qp8t_.log
03/22/2012 03:51:12: Thread 1 advanced to log sequence 3513 (LGWR switch)
03/22/2012 03:51:12:&nbsp;&nbsp; Current log# 3 seq# 3513 mem# 0: /apps/oracle/oradata/RMAN/onlinelog/o1_mf_3_5rg7qsmw_.log
03/22/2012 03:51:12: Current log# 3 seq# 3513 mem# 1: /apps/oracle/backup/flash_recovery_area/RMAN/onlinelog/o1_mf_3_5rg7qwm0_.log
03/22/2012 03:51:18: Archived Log entry 3470 added for thread 1 sequence 3512 ID 0x5f45a87f dest 1:
03/22/2012 08:50:07: ALTER SYSTEM ARCHIVE LOG
03/22/2012 08:50:07: Thread 1 cannot allocate new log, sequence 3514
03/22/2012 08:50:07: Private strand flush not complete
03/22/2012 08:50:07:&nbsp;&nbsp; Current log# 3 seq# 3513 mem# 0: /apps/oracle/oradata/RMAN/onlinelog/o1_mf_3_5rg7qsmw_.log
03/22/2012 08:50:07: Current log# 3 seq# 3513 mem# 1: /apps/oracle/backup/flash_recovery_area/RMAN/onlinelog/o1_mf_3_5rg7qwm0_.log
03/22/2012 08:50:09: Thread 1 advanced to log sequence 3514 (LGWR switch)
03/22/2012 08:50:09:&nbsp;&nbsp; Current log# 1 seq# 3514 mem# 0: /apps/oracle/oradata/RMAN/onlinelog/o1_mf_1_5rg7q7wc_.log
03/22/2012 08:50:09: Current log# 1 seq# 3514 mem# 1: /apps/oracle/backup/flash_recovery_area/RMAN/onlinelog/o1_mf_1_5rg7qfn0_.log
03/22/2012 08:50:14: Archived Log entry 3471 added for thread 1 sequence 3513 ID 0x5f45a87f dest 1:
03/22/2012 08:50:19: ALTER SYSTEM ARCHIVE LOG
03/22/2012 08:50:20: Thread 1 cannot allocate new log, sequence 3515
03/22/2012 08:50:20: Private strand flush not complete
03/22/2012 08:50:20:&nbsp;&nbsp; Current log# 1 seq# 3514 mem# 0: /apps/oracle/oradata/RMAN/onlinelog/o1_mf_1_5rg7q7wc_.log
03/22/2012 08:50:20: Current log# 1 seq# 3514 mem# 1: /apps/oracle/backup/flash_recovery_area/RMAN/onlinelog/o1_mf_1_5rg7qfn0_.log
03/22/2012 08:50:22: Thread 1 advanced to log sequence 3515 (LGWR switch)
03/22/2012 08:50:22:&nbsp;&nbsp; Current log# 2 seq# 3515 mem# 0: /apps/oracle/oradata/RMAN/onlinelog/o1_mf_2_5rg7qlfr_.log
03/22/2012 08:50:22: Current log# 2 seq# 3515 mem# 1: /apps/oracle/backup/flash_recovery_area/RMAN/onlinelog/o1_mf_2_5rg7qp8t_.log
03/22/2012 08:50:24: Archived Log entry 3472 added for thread 1 sequence 3514 ID 0x5f45a87f dest 1:

PL/SQL procedure successfully completed.

</code></pre></p>
<p> <img src='http://www.oracletool.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.oracletool.com/blog/procedure-to-get-the-alert-log-from-within-the-database/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sending email from PL/SQL, with attachments</title>
		<link>http://www.oracletool.com/blog/sending-email-from-plsql-with-attachments/</link>
		<comments>http://www.oracletool.com/blog/sending-email-from-plsql-with-attachments/#comments</comments>
		<pubDate>Fri, 16 Mar 2012 15:47:53 +0000</pubDate>
		<dc:creator>Adam vonNieda</dc:creator>
				<category><![CDATA[Oracle Database Administration]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[PL/SQL]]></category>

		<guid isPermaLink="false">http://www.oracletool.com/blog/?p=64</guid>
		<description><![CDATA[Want to be able to send email from within Oracle, to multiple recipients, and with attachments? Well, allrightythen. The attachments will be taken from the OS, but this could be easily modified to take them from an Oracle table of &#8230; <a href="http://www.oracletool.com/blog/sending-email-from-plsql-with-attachments/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Want to be able to send email from within Oracle, to multiple recipients, and with attachments? Well, allrightythen. The attachments will be taken from the OS, but this could be easily modified to take them from an Oracle table of your choosing. Some of this code I gathered from other places, and a bunch of it is mine. In the end, this is the most complete PL/SQL email sending package that I know of. When we&#8217;re done, we&#8217;ll have a package that looks like below, and we&#8217;ll execute it as so..<br />
<pre><code>
Begin
&nbsp;&nbsp; send_email.send(
&nbsp;&nbsp; ToList=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;adam@oracletool.com&#039;,
&nbsp;&nbsp; Subject=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#039;Test email with attachments&#039;,
&nbsp;&nbsp; Body=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;Here is the body&#039;,
&nbsp;&nbsp; FromEmail=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#039;Adam@Oracletool.com&#039;,
&nbsp;&nbsp; FromHost=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;Oracletool.com&#039;,
&nbsp;&nbsp; SMTPServer=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;localhost&#039;,
&nbsp;&nbsp; AttachList=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;send_email.sql,login.sql&#039;,
&nbsp;&nbsp; Directory=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#039;ATTACHMENTS&#039;);
End;
/

08:25:52 DEMO (ADAM) &gt; Desc send_email;
FUNCTION GET_MIME_TYPE RETURNS VARCHAR2
 Argument Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;In/Out Default?
 ------------------------------ ----------------------- ------ --------
 FILENAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IN
PROCEDURE SEND
 Argument Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;In/Out Default?
 ------------------------------ ----------------------- ------ --------
 TOLIST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IN
 SUBJECT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VARCHAR2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IN
 BODY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IN
 FROMEMAIL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VARCHAR2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IN&nbsp;&nbsp;&nbsp;&nbsp; DEFAULT
 FROMHOST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IN&nbsp;&nbsp;&nbsp;&nbsp; DEFAULT
 SMTPSERVER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IN&nbsp;&nbsp;&nbsp;&nbsp; DEFAULT
 ATTACHLIST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IN&nbsp;&nbsp;&nbsp;&nbsp; DEFAULT
 DIRECTORY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VARCHAR2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IN&nbsp;&nbsp;&nbsp;&nbsp; DEFAULT
FUNCTION SPLIT RETURNS SPLIT_TBL
 Argument Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;In/Out Default?
 ------------------------------ ----------------------- ------ --------
 P_LIST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IN
 P_DEL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VARCHAR2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IN&nbsp;&nbsp;&nbsp;&nbsp; DEFAULT
</code></pre></p>
<p>Couple of prerequisites here. First of all, if you want to send attachments from the OS, you&#8217;ll need to create an Oracle DIRECTORY object to point to the OS directory. Here&#8217;s an example.<br />
<pre><code>
Create or replace directory ATTACHMENTS as &#039;/home/oracle/attachments&#039;;
</code></pre></p>
<p>You&#8217;ll then reference that directory from the send_email package.</p>
<p>Next, we need to allow our user to contact the email server, in this case, localhost, as I&#8217;ve got a local email server running that allows connections locally. If you&#8217;re running Oracle 11.1.0.6 or greater, you&#8217;ll need to create an ACL for the user, and we&#8217;re going to use a great procedure I found for this called, you guessed it, create_acl from Metalink note# 557070.1. If you don&#8217;t add an ACL, you&#8217;ll be getting to know an error like &#8220;ORA-24247: network access denied by access control list (ACL)&#8221;</p>
<p>This would be run as the &#8220;SYS&#8221; user, by the way.</p>
<p><pre><code>
create or replace procedure create_acl(
&nbsp;&nbsp;aacl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; varchar2,
&nbsp;&nbsp;acomment&nbsp;&nbsp; varchar2,
&nbsp;&nbsp;aprincipal varchar2,
&nbsp;&nbsp;aisgrant&nbsp;&nbsp; boolean,
&nbsp;&nbsp;aprivilege varchar2,
&nbsp;&nbsp;aserver&nbsp;&nbsp;&nbsp;&nbsp;varchar2,
&nbsp;&nbsp;aport&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;number)
is
begin&nbsp;&nbsp;
&nbsp;&nbsp;begin
&nbsp;&nbsp;&nbsp;&nbsp;DBMS_NETWORK_ACL_ADMIN.DROP_ACL(aacl);
&nbsp;&nbsp;&nbsp;&nbsp; dbms_output.put_line(&#039;ACL dropped.....&#039;); 
&nbsp;&nbsp;exception
&nbsp;&nbsp;&nbsp;&nbsp;when others then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;Error dropping ACL: &#039;||aacl);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(sqlerrm);
&nbsp;&nbsp;end;
&nbsp;&nbsp;begin
&nbsp;&nbsp;&nbsp;&nbsp;DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(aacl,acomment,aprincipal,aisgrant,aprivilege);
&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;ACL created.....&#039;); 
&nbsp;&nbsp;exception
&nbsp;&nbsp;&nbsp;&nbsp;when others then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;Error creating ACL: &#039;||aacl);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(sqlerrm);
&nbsp;&nbsp;end;&nbsp;&nbsp;
&nbsp;&nbsp;begin
&nbsp;&nbsp;&nbsp;&nbsp;DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(aacl,aserver,aport);
&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;ACL assigned.....&#039;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;exception
&nbsp;&nbsp;&nbsp;&nbsp;when others then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;Error assigning ACL: &#039;||aacl);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(sqlerrm);
&nbsp;&nbsp;end;&nbsp;&nbsp; 
&nbsp;&nbsp;commit;
&nbsp;&nbsp;dbms_output.put_line(&#039;ACL commited.....&#039;); 
end;
/
show error
</code></pre></p>
<p>And then it&#8217;s executed via the following. This example gives the user ADAM privileges to make an outbound connection to port 25 on any server. </p>
<p><pre><code>
begin
&nbsp;&nbsp;create_acl(
&nbsp;&nbsp;&nbsp;&nbsp;&#039;adam_smtp_acl.xml&#039;,
&nbsp;&nbsp;&nbsp;&nbsp;&#039;ACL for ADAM to allow SMTP outbound&#039;,
&nbsp;&nbsp;&nbsp;&nbsp;&#039;ADAM&#039;,
&nbsp;&nbsp;&nbsp;&nbsp;TRUE,
&nbsp;&nbsp;&nbsp;&nbsp;&#039;connect&#039;,
&nbsp;&nbsp;&nbsp;&nbsp;&#039;*&#039;,
&nbsp;&nbsp;&nbsp;&nbsp;25);
end;
/
</code></pre></p>
<p>We need to create a type to support the below package</p>
<p><pre><code>
Create or replace TYPE &quot;SPLIT_TBL&quot;&nbsp;&nbsp;AS TABLE OF VARCHAR2(32767);
/

</code></pre></p>
<p>OK then, let&#8217;s create the send_email package!</p>
<p><pre><code>
CREATE OR REPLACE package send_email as

&nbsp;&nbsp; Function get_mime_type
&nbsp;&nbsp; (
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar2
&nbsp;&nbsp; ) return varchar2;

&nbsp;&nbsp; Function split
&nbsp;&nbsp; (
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_list&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar2,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_del&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar2 := &#039;,&#039;
&nbsp;&nbsp; ) return split_tbl pipelined;

&nbsp;&nbsp; Procedure send (
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tolist&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar2,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Subject&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar2,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Body&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar2,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FromEmail&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar2 default &#039;DoNotReply@Nowhere.Com&#039;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SmtpServer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar2 default &#039;localhost&#039;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AttachList&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar2 default null,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Directory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar2 default null
&nbsp;&nbsp; );

End send_email;
/

Show error;

CREATE OR REPLACE package body send_email as

&nbsp;&nbsp; Function get_mime_type
&nbsp;&nbsp; (
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar2
&nbsp;&nbsp; ) return varchar2
&nbsp;&nbsp; is
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NewFileName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; varchar2(250);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type mime_type_arr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is table of varchar2(250) index by varchar2(20);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_type_arr;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; varchar2(250);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extension&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; varchar2(250);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp; begin
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Populate the mime_types array
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;323&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;text/h323&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;acx&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/internet-property-stream&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;ai&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;application/postscript&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;aif&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;audio/x-aiff&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;aifc&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;audio/x-aiff&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;aiff&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;audio/x-aiff&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;asf&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;video/x-ms-asf&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;asr&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;video/x-ms-asf&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;asx&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;video/x-ms-asf&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;au&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;audio/basic&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;avi&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;video/x-msvideo&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;axs&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/olescript&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;bas&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;text/plain&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;bcpio&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-bcpio&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;bin&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/octet-stream&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;bmp&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;image/bmp&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;c&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;text/plain&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;cat&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/vnd.ms-pkiseccat&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;cdf&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-cdf&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;cer&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-x509-ca-cert&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;class&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/octet-stream&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;clp&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-msclip&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;cmx&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;image/x-cmx&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;cod&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;image/cis-cod&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;cpio&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;application/x-cpio&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;crd&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-mscardfile&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;crl&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/pkix-crl&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;crt&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-x509-ca-cert&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;csh&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-csh&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;css&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;text/css&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;dcr&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-director&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;der&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-x509-ca-cert&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;dir&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-director&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;dll&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-msdownload&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;dms&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/octet-stream&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;doc&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/msword&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;dot&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/msword&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;dvi&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-dvi&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;dxr&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-director&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;eps&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/postscript&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;etx&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;text/x-setext&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;evy&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/envoy&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;exe&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/octet-stream&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;fif&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/fractals&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;flr&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;x-world/x-vrml&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;gif&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;image/gif&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;gtar&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;application/x-gtar&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;gz&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;application/x-gzip&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;h&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;text/plain&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;hdf&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-hdf&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;hlp&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/winhlp&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;hqx&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/mac-binhex40&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;hta&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/hta&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;htc&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;text/x-component&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;htm&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;text/html&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;html&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;text/html&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;htt&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;text/webviewhtml&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;ico&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;image/x-icon&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;ief&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;image/ief&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;iii&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-iphone&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;ins&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-internet-signup&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;isp&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-internet-signup&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;jfif&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;image/pipeg&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;jpe&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;image/jpeg&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;jpeg&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;image/jpeg&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;jpg&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;image/jpeg&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;js&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;application/x-javascript&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;latex&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-latex&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;lha&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/octet-stream&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;lsf&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;video/x-la-asf&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;lsx&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;video/x-la-asf&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;lzh&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/octet-stream&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;m13&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-msmediaview&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;m14&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-msmediaview&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;m3u&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;audio/x-mpegurl&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;man&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-troff-man&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;mdb&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-msaccess&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;me&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;application/x-troff-me&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;mht&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;message/rfc822&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;mhtml&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;message/rfc822&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;mid&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;audio/mid&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;mny&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-msmoney&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;mov&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;video/quicktime&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;movie&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;video/x-sgi-movie&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;mp2&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;video/mpeg&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;mp3&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;audio/mpeg&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;mpa&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;video/mpeg&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;mpe&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;video/mpeg&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;mpeg&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;video/mpeg&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;mpg&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;video/mpeg&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;mpp&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/vnd.ms-project&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;mpv2&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;video/mpeg&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;ms&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;application/x-troff-ms&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;mvb&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-msmediaview&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;nws&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;message/rfc822&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;oda&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/oda&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;p10&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/pkcs10&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;p12&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-pkcs12&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;p7b&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-pkcs7-certificates&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;p7c&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-pkcs7-mime&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;p7m&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-pkcs7-mime&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;p7r&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-pkcs7-certreqresp&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;p7s&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-pkcs7-signature&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;pbm&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;image/x-portable-bitmap&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;pdf&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/pdf&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;pfx&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-pkcs12&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;pgm&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;image/x-portable-graymap&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;pko&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/ynd.ms-pkipko&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;pma&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-perfmon&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;pmc&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-perfmon&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;pml&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-perfmon&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;pmr&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-perfmon&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;pmw&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-perfmon&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;pnm&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;image/x-portable-anymap&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;pot,&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;application/vnd.ms-powerpoint&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;ppm&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;image/x-portable-pixmap&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;pps&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/vnd.ms-powerpoint&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;ppt&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/vnd.ms-powerpoint&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;prf&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/pics-rules&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;ps&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;application/postscript&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;pub&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-mspublisher&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;qt&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;video/quicktime&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;ra&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;audio/x-pn-realaudio&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;ram&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;audio/x-pn-realaudio&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;ras&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;image/x-cmu-raster&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;rgb&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;image/x-rgb&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;rmi&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;audio/mid&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;roff&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;application/x-troff&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;rtf&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/rtf&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;rtx&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;text/richtext&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;scd&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-msschedule&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;sct&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;text/scriptlet&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;setpay&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;application/set-payment-initiation&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;setreg&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;application/set-registration-initiation&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;sh&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;application/x-sh&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;shar&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;application/x-shar&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;sit&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-stuffit&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;snd&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;audio/basic&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;spc&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-pkcs7-certificates&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;spl&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/futuresplash&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;src&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-wais-source&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;sst&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/vnd.ms-pkicertstore&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;stl&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/vnd.ms-pkistl&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;stm&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;text/html&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;svg&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;image/svg+xml&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;sv4cpio&#039;)&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-sv4cpio&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;sv4crc&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;application/x-sv4crc&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;swf&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-shockwave-flash&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;t&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-troff&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;tar&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-tar&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;tcl&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-tcl&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;tex&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-tex&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;texi&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;application/x-texinfo&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;texinfo&#039;)&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-texinfo&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;tgz&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-compressed&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;tif&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;image/tiff&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;tiff&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;image/tiff&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;tr&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;application/x-troff&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;trm&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-msterminal&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;tsv&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;text/tab-separated-values&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;txt&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;text/plain&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;uls&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;text/iuls&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;ustar&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-ustar&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;vcf&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;text/x-vcard&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;vrml&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= &#039;x-world/x-vrml&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;wav&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;audio/x-wav&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;wcm&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/vnd.ms-works&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;wdb&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/vnd.ms-works&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;wks&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/vnd.ms-works&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;wmf&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-msmetafile&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;wps&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/vnd.ms-works&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;wri&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-mswrite&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;wrl&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;x-world/x-vrml&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;wrz&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;x-world/x-vrml&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;xaf&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;x-world/x-vrml&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;xbm&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;image/x-xbitmap&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;xla&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/vnd.ms-excel&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;xlc&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/vnd.ms-excel&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;xlm&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/vnd.ms-excel&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;xls&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/vnd.ms-excel&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;xlt&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/vnd.ms-excel&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;xlw&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/vnd.ms-excel&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;xof&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;x-world/x-vrml&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;xpm&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;image/x-xpixmap&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;xwd&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;image/x-xwindowdump&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;z&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/x-compress&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_types(&#039;zip&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &#039;application/zip&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Determine the file extension
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;Splitting file &#039;||FileName||&#039; to get extension.&#039;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for i in (Select column_value as extension from table(split(FileName,&#039;.&#039;))) loop
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; extension := i.extension;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end loop;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- use the extension to determine the MIME type
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if mime_types.exists(extension) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mime_type := mime_types(extension);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- Default to &#039;text/plain&#039; if not found
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mime_type := &#039;text/plain&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end if;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;Extension is &#039;||extension);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;mime_type is &#039;||mime_type);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return mime_type;

&nbsp;&nbsp; end get_mime_type;

&nbsp;&nbsp; Function split
&nbsp;&nbsp; (
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_list varchar2,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_del varchar2 := &#039;,&#039;
&nbsp;&nbsp; ) return split_tbl pipelined
&nbsp;&nbsp; is
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l_idx&nbsp;&nbsp;&nbsp;&nbsp;pls_integer;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l_list&nbsp;&nbsp;&nbsp;&nbsp;varchar2(32767) := p_list;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l_value&nbsp;&nbsp;&nbsp;&nbsp;varchar2(32767);
&nbsp;&nbsp; begin
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loop
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l_idx := instr(l_list,p_del);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if l_idx &gt; 0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pipe row(substr(l_list,1,l_idx-1));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l_list := substr(l_list,l_idx+length(p_del));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pipe row(l_list);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end if;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end loop;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;
&nbsp;&nbsp; end split;

&nbsp;&nbsp; Procedure send (
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ToList&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar2,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Subject&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar2,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Body&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar2,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FromEmail&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar2 default &#039;DoNotReply@Nowhere.Com&#039;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SmtpServer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar2 default &#039;localhost&#039;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AttachList&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar2 default null,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Directory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar2 default null
&nbsp;&nbsp;&nbsp;&nbsp;) is

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;smtp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;utl_smtp.CONNECTION;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reply&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; utl_smtp.REPLY;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file_handle&nbsp;&nbsp;&nbsp;&nbsp; bfile;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file_exists&nbsp;&nbsp;&nbsp;&nbsp; boolean;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;block_size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;number;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file_len&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;number;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; number;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; number;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read_bytes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;number;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raw(200);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my_code&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; number;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my_errm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; varchar2(32767);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime_type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; varchar2(50);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myhostname&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar2(255);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;att_table&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbms_utility.uncl_array;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;att_count&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; number;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tablen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;binary_integer;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loopcount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; number;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Procedure WriteLine(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar2 default null
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ) is

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Begin
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;utl_smtp.Write_Data( smtp, line||utl_tcp.CRLF );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End;

&nbsp;&nbsp;&nbsp;&nbsp;Begin

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Select sys_context(&#039;USERENV&#039;,&#039;SERVER_HOST&#039;) into myhostname from dual;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;ToList:&nbsp;&nbsp;&nbsp;&nbsp; &#039;||ToList);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;Subject:&nbsp;&nbsp;&nbsp;&nbsp;&#039;||Subject);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;Body:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;||Body);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;FromEmail:&nbsp;&nbsp;&#039;||FromEmail);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;SmtpServer: &#039;||SmtpServer);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;AttachList: &#039;||AttachList);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;Directory:&nbsp;&nbsp;&#039;||Directory);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;ToList:&nbsp;&nbsp;&nbsp;&nbsp; &#039;||ToList);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;myhostname: &#039;||myhostname);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;Opening connection to &#039;||SmtpServer);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;smtp := utl_smtp.OPEN_CONNECTION( SmtpServer, 25 );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reply := utl_smtp.HELO( smtp, myhostname);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reply := utl_smtp.MAIL( smtp, FromEmail );

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Split up the recipient list
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for i in (Select column_value as recipient from table(split(ToList))) loop
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbms_output.put_line(&#039;Recipient: &#039;||i.recipient);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reply := utl_smtp.RCPT( smtp, i.recipient);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end loop;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reply := utl_smtp.open_data( smtp );

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteLine( &#039;From: &#039;||FromEmail);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Split up the recipient list (again)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for i in (Select column_value as recipient from table(split(ToList))) loop
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WriteLine( &#039;To: &#039;||i.recipient);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end loop;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteLine( &#039;Subject: &#039;||Subject );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteLine( &#039;Content-Type: multipart/mixed; boundary=&quot;gc0p4Jq0M2Yt08jU534c0p&quot;&#039; );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteLine( &#039;MIME-Version: 1.0&#039; );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteLine;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- start of boundary payloads
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteLine( &#039;--gc0p4Jq0M2Yt08jU534c0p&#039; );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteLine( &#039;Content-Type: text/plain&#039; );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteLine;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteLine(&nbsp;&nbsp;Body );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteLine;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteLine( &#039;--gc0p4Jq0M2Yt08jU534c0p&#039; );

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;Starting attachment segment&#039;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;Directory: &#039;||Directory);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;AttachList: &#039;||AttachList);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Split up the attachment list
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loopcount := 0; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Select count(*) into att_count from table(split(AttachList));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if AttachList is not null and Directory is not null then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for i in (Select ltrim(rtrim(column_value)) as attachment from table(split(AttachList))) loop
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loopcount := loopcount +1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;Attaching: &#039;||Directory||&#039;/&#039;||i.attachment);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;utl_file.fgetattr(Directory, i.attachment, file_exists, file_len, block_size);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if file_exists then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbms_output.put_line(&#039;Getting mime_type for the attachment&#039;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select get_mime_type(i.attachment) into mime_type from dual;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WriteLine( &#039;Content-Type: &#039;||mime_type );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WriteLine( &#039;Content-Transfer-Encoding: base64&#039;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WriteLine( &#039;Content-Disposition: attachment; filename=&quot;&#039;||i.attachment||&#039;&quot;&#039; );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WriteLine;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file_handle := bfilename(Directory,i.attachment);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos := 1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; total := 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file_len := dbms_lob.getlength(file_handle);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbms_lob.open(file_handle,dbms_lob.lob_readonly);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loop
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if pos + 57 - 1 &gt; file_len then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; read_bytes := file_len - pos + 1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --dbms_output.put_line(&#039;Last read - Start: &#039;||pos);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --dbms_output.put_line(&#039;Reading - Start: &#039;||pos);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; read_bytes := 57;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end if;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total := total + read_bytes;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_lob.read(file_handle,read_bytes,pos,data);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;utl_smtp.write_raw_data(smtp,utl_encode.base64_encode(data));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--utl_smtp.write_raw_data(smtp,data);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos := pos + 57;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if pos &gt; file_len then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end if;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end loop;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbms_output.put_line(&#039;Length was &#039;||file_len);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbms_lob.close(file_handle);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (loopcount &lt; att_count) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteLine;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteLine( &#039;--gc0p4Jq0M2Yt08jU534c0p&#039; );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteLine;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteLine( &#039;--gc0p4Jq0M2Yt08jU534c0p--&#039; );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;Writing end boundary&#039;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end if;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbms_output.put_line(&#039;Skipping: &#039;||Directory||&#039;/&#039;||i.attachment||&#039;Does not exist.&#039;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end if;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end loop;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end if;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reply := utl_smtp.close_data( smtp );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reply := utl_smtp.quit( smtp );

&nbsp;&nbsp; exception
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when others then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my_code := sqlcode;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my_errm := sqlerrm;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbms_output.put_line(&#039;Error code &#039; || my_code || &#039;: &#039; || my_errm);
&nbsp;&nbsp;end;

end send_email;
/
</code></pre></p>
<p>Once you&#8217;ve created the send_email package, and added an ACL for your user (if necessary), you should be ready to fire off an email. <img src='http://www.oracletool.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.oracletool.com/blog/sending-email-from-plsql-with-attachments/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to read xml files from the OS, parse them, and load the data into Oracle</title>
		<link>http://www.oracletool.com/blog/how-to-read-xml-files-from-the-os-parse-them-and-load-the-data-into-oracle/</link>
		<comments>http://www.oracletool.com/blog/how-to-read-xml-files-from-the-os-parse-them-and-load-the-data-into-oracle/#comments</comments>
		<pubDate>Thu, 15 Mar 2012 16:20:42 +0000</pubDate>
		<dc:creator>Adam vonNieda</dc:creator>
				<category><![CDATA[Oracle Database Administration]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[PL/SQL]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.oracletool.com/blog/?p=25</guid>
		<description><![CDATA[Want to read xml files from the OS, parse them, and load the data into Oracle, all from PL/SQL (and a small Java stored procedure )? Well allrightythen! * This will all be done from within the database. * The &#8230; <a href="http://www.oracletool.com/blog/how-to-read-xml-files-from-the-os-parse-them-and-load-the-data-into-oracle/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Want to read xml files from the OS, parse them, and load the data into Oracle, all from PL/SQL (and a small Java stored procedure <img src='http://www.oracletool.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )? Well allrightythen!</p>
<p>* This will all be done from within the database.</p>
<p>* The OS directories will be referenced only by Oracle directory name, not actual directory name.</p>
<p>Disclaimer: This code is not all mine. I&#8217;ve collected snippets from several different places, and wrote a bunch of my own as well. The goal was to take it all and put it into one post so that you can go from start to finish in one place. </p>
<p>We&#8217;ll be doing the following in this post</p>
<p>1) List the source directory<br />
2) Loop through the file names<br />
3) Parse the XML files<br />
4) Insert the data (not the XML file) into a table<br />
5) Move the file to a destination directory</p>
<p>Source directory:      /tmp/xml_inbound<br />
Destination directory: /tmp/xml_archive</p>
<p>Example XML file<br />
<pre><code>
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;Data&gt;
&nbsp;&nbsp; &lt;Header&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ID&gt;Batch 1&lt;/ID&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;AnimalCount&gt;2&lt;/AnimalCount&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;BreedCount&gt;6&lt;/BreedCount&gt;
&nbsp;&nbsp; &lt;/Header&gt;
&nbsp;&nbsp; &lt;Animals&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Animal&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ID&gt;1&lt;/ID&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Type&gt;Dog&lt;/Type&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;BreedList&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Breed&gt;Bullmastiff&lt;/Breed&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Breed&gt;Dalmation&lt;/Breed&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Breed&gt;American Bulldog&lt;/Breed&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/BreedList&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Animal&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Animal&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ID&gt;2&lt;/ID&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Type&gt;Cat&lt;/Type&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;BreedList&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Breed&gt;Tabby&lt;/Breed&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Breed&gt;Manx&lt;/Breed&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Breed&gt;Savannah&lt;/Breed&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/BreedList&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Animal&gt;
&nbsp;&nbsp; &lt;/Animals&gt;
&lt;/Data&gt;
</code></pre></p>
<p>Let&#8217;s do a little OS level setup, as the &#8220;oracle&#8221; user</p>
<p><pre><code>
# mkdir /tmp/xml_inbound
# mkdir /tmp/xml_archive

Copy the above XML into a file called /tmp/xml_inbound/&lt;anything&gt;.xml 
</code></pre></p>
<p>And database level &#8211; Note that I&#8217;m granting privileges to &#8220;ADAM&#8221;.<br />
That might not be you..</p>
<p><pre><code>
sqlplus &quot;/ as sysdba&quot;

11:08:35 DEMO (SYS) &gt; Create directory xml_inbound as &#039;/tmp/xml_inbound&#039;;
11:08:43 DEMO (SYS) &gt; Create directory xml_archive as &#039;/tmp/xml_archive&#039;;
11:08:51 DEMO (SYS) &gt; Grant read,write on directory xml_inbound to ADAM;
11:08:58 DEMO (SYS) &gt; Grant read,write on directory xml_archive to ADAM;
--
-- This is for the Java stored procedure we&#039;ll create below. 
-- It&#039;s only used for reading the directory contents.
--
11:09:03 DEMO (SYS) &gt; Exec dbms_java.grant_permission( &#039;ADAM&#039;,&#039;SYS:java.io.FilePermission&#039;,&#039;/tmp/xml_inbound&#039;, &#039;read&#039;);
</code></pre></p>
<p>First, we need to be able to get a directory listing from the OS. We&#8217;ll use Java for this. One procedure will populate the DIR_LIST global temporary table with the file names. The table will be cleared when we do a commit. The other two procedures are for bringing the data in as a variable, and renaming (moving) the OS file.</p>
<p><strong>As your non-SYS database user from now on.. For me it&#8217;s &#8220;ADAM&#8221;</strong></p>
<p><pre><code>
Create global temporary table DIR_LIST
(
&nbsp;&nbsp; filename varchar2(255)
) on commit delete rows;
</code></pre></p>
<p>The below code will create the following procedures</p>
<p><pre><code>
dir_list&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Get a listing of files from a directory
get_xml_file_from_os&nbsp;&nbsp;&nbsp;&nbsp;Load an XML file into a variable of XMLType
move_os_file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Used to move files from inbound to archive

Create or replace
and compile java source named &quot;DirList&quot;
as
import java.io.*;
import java.sql.*;

public class DirList
{
&nbsp;&nbsp; public static void getList(String oracle_directory)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws SQLException
&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String os_directory;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#sql {Select directory_path into :os_directory from all_directories where directory_name = upper(:oracle_directory)};

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File path = new File( os_directory );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[] list = path.list();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String element;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i = 0; i &lt; list.length; i++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element = list[i];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #sql { INSERT INTO DIR_LIST (FILENAME) VALUES (:element) };
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp; }

}
/

Create or replace
procedure get_dir_list( oracle_directory in varchar2 )
&nbsp;&nbsp; as language java
&nbsp;&nbsp; name &#039;DirList.getList( java.lang.String )&#039;;
/

Create or replace procedure move_os_file
(
&nbsp;&nbsp; source_directory&nbsp;&nbsp;&nbsp;&nbsp; in varchar2,
&nbsp;&nbsp; source_file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2,
&nbsp;&nbsp; target_directory&nbsp;&nbsp;&nbsp;&nbsp; in varchar2,
&nbsp;&nbsp; target_file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2
)

as

&nbsp;&nbsp; srcdir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; varchar2(255) := upper(source_directory);
&nbsp;&nbsp; tgtdir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; varchar2(255) := upper(target_directory);

begin

&nbsp;&nbsp; --
&nbsp;&nbsp; -- NOTE: If you&#039;re getting the all-too-familiar
&nbsp;&nbsp; -- ORA-29292: file rename operation failed
&nbsp;&nbsp; -- and you&#039;re SURE that your directory names are correct,
&nbsp;&nbsp; -- and you&#039;re SURE that your privileges are correct, both at the 
&nbsp;&nbsp; -- OS level, and within the database, there&#039;s one last thing that
&nbsp;&nbsp; -- can get you. I learned the hard way that this command will NOT
&nbsp;&nbsp; -- work successfully renaming a file from one filesystem to another,
&nbsp;&nbsp; -- at least when those filesystems are NFS mounted. That is all. 
&nbsp;&nbsp; --
&nbsp;&nbsp; utl_file.frename(srcdir,source_file,tgtdir,target_file,TRUE);

end move_os_file;
/

Create or replace procedure get_xml_file_from_os 
(
&nbsp;&nbsp; oracle_directory&nbsp;&nbsp;&nbsp;&nbsp; in varchar2, 
&nbsp;&nbsp; filename&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in varchar2 ,
&nbsp;&nbsp; o_xml&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out xmltype
)

as

&nbsp;&nbsp;&nbsp;&nbsp;dest_clob&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clob;
&nbsp;&nbsp;&nbsp;&nbsp;src_clob&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bfile;
&nbsp;&nbsp;&nbsp;&nbsp;dst_offset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;number := 1 ;
&nbsp;&nbsp;&nbsp;&nbsp;src_offset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;number := 1 ;
&nbsp;&nbsp;&nbsp;&nbsp;lang_ctx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;number := DBMS_LOB.DEFAULT_LANG_CTX;
&nbsp;&nbsp;&nbsp;&nbsp;warning&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; number;
&nbsp;&nbsp;&nbsp;&nbsp;os_directory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar2(255);
&nbsp;&nbsp;&nbsp;&nbsp;ora_directory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; varchar2(255);

begin

&nbsp;&nbsp; ora_directory := upper(oracle_directory);

&nbsp;&nbsp; Select directory_path 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;into os_directory 
&nbsp;&nbsp; from all_directories
&nbsp;&nbsp; where directory_name = ora_directory;

&nbsp;&nbsp; dbms_lob.createtemporary(dest_clob,true);

&nbsp;&nbsp; dbms_output.put_line(&#039;OS directory: &#039;||os_directory);
&nbsp;&nbsp; dbms_output.put_line(&#039;Oracle directory: &#039;||ora_directory);
&nbsp;&nbsp; dbms_output.put_line(&#039;File: &#039;||filename);
&nbsp;&nbsp; src_clob := bfilename(ora_directory, filename);

&nbsp;&nbsp; dbms_output.put_line(&#039;Opening lob&#039;); 
&nbsp;&nbsp; dbms_lob.open(src_clob,DBMS_LOB.LOB_READONLY);

&nbsp;&nbsp; dbms_output.put_line(&#039;Loading lob&#039;);
&nbsp;&nbsp; dbms_lob.LoadCLOBFromFile(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dest_lob&nbsp;&nbsp;&nbsp;&nbsp; =&gt; dest_clob,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;src_bfile&nbsp;&nbsp;&nbsp;&nbsp;=&gt; src_clob,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;amount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&gt; DBMS_LOB.GETLENGTH(src_clob),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dest_offset&nbsp;&nbsp;=&gt; dst_offset,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;src_offset&nbsp;&nbsp; =&gt; src_offset,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bfile_csid&nbsp;&nbsp; =&gt; DBMS_LOB.DEFAULT_CSID,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lang_context =&gt; lang_ctx,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;warning&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; warning
&nbsp;&nbsp; );

&nbsp;&nbsp; dbms_lob.close(src_clob);

&nbsp;&nbsp; o_xml := xmltype(dest_clob);

end get_xml_file_from_os;
/
</code></pre></p>
<p>Now that we can read files from the OS, we need to parse them and insert the data. Let&#8217;s create a couple of tables to support this.</p>
<p><pre><code>
Create table ANIMALS
(
&nbsp;&nbsp; animal_id&nbsp;&nbsp; number,
&nbsp;&nbsp; type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar2(20)
);

Create table BREEDS
(
&nbsp;&nbsp; animal_id&nbsp;&nbsp;&nbsp;&nbsp;number,
&nbsp;&nbsp; breed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar2(255)
);
</code></pre></p>
<p>And finally, a stored procedure to pull it all together. Here&#8217;s where we&#8217;ll do the XML parsing and inserting into the database.</p>
<p><pre><code>
Create or replace procedure process_xml

as

&nbsp;&nbsp; v_XML&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMLType;
&nbsp;&nbsp; v_rowcount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; number;

&nbsp;&nbsp; --
&nbsp;&nbsp; -- Header variables
&nbsp;&nbsp; --
&nbsp;&nbsp; v_BatchID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar2(20);
&nbsp;&nbsp; v_AnimalCount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;number;
&nbsp;&nbsp; v_BreedCount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; number;

&nbsp;&nbsp; --
&nbsp;&nbsp; -- Animal variables
&nbsp;&nbsp; --
&nbsp;&nbsp; v_AnimalID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ANIMALS.ANIMAL_ID%TYPE;
&nbsp;&nbsp; v_AnimalType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ANIMALS.TYPE%TYPE;

&nbsp;&nbsp; --
&nbsp;&nbsp; -- Breed variables
&nbsp;&nbsp; --
&nbsp;&nbsp; v_BreedID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BREEDS.ANIMAL_ID%TYPE;
&nbsp;&nbsp; v_Breed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BREEDS.BREED%TYPE;

Begin

&nbsp;&nbsp; dbms_output.put_line(&#039;Getting directory listing&#039;);
&nbsp;&nbsp; --
&nbsp;&nbsp; -- The records in the DIR_LIST table will be removed on commit!
&nbsp;&nbsp; --
&nbsp;&nbsp; get_dir_list(&#039;XML_INBOUND&#039;);
&nbsp;&nbsp; for i in (select filename from dir_list where upper(filename) like &#039;%.XML&#039;)
&nbsp;&nbsp; loop
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v_rowcount := 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;Filename: &#039;||i.filename);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get_xml_file_from_os(&#039;XML_INBOUND&#039;,i.filename,v_XML);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;File loaded&#039;);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Extract the Header
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;Getting Batch ID&#039;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v_BatchID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := v_XML.extract(&#039;/Data/Header/ID/text()&#039;).getStringVal();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;Getting Animal Count&#039;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v_AnimalCount&nbsp;&nbsp;&nbsp;&nbsp; := v_XML.extract(&#039;/Data/Header/AnimalCount/text()&#039;).getNumberVal();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v_BreedCount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:= v_XML.extract(&#039;/Data/Header/BreedCount/text()&#039;).getNumberVal();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;Batch ID: &#039;||v_BatchID);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;Animal Count: &#039;||v_AnimalCount);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;Breed Count: &#039;||v_BreedCount);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Loop through the animals
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v_AnimalCount := 1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;While v_XML.existsNode(&#039;/Data/Animals/Animal[&#039;||v_AnimalCount||&#039;]&#039;) = 1

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Loop through Animals
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loop
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v_AnimalID&nbsp;&nbsp;&nbsp;&nbsp; :=&nbsp;&nbsp;v_XML.extract(&#039;/Data/Animals/Animal[&#039;||v_AnimalCount||&#039;]/ID/text()&#039;).getNumberVal();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v_AnimalType&nbsp;&nbsp; :=&nbsp;&nbsp;v_XML.extract(&#039;/Data/Animals/Animal[&#039;||v_AnimalCount||&#039;]/Type/text()&#039;).getStringVal();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbms_output.put_line(&#039;AnimalID: &#039;||v_AnimalID);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbms_output.put_line(&#039;AnimalType: &#039;||v_AnimalType);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Insert into ANIMALS values (v_AnimalID,v_AnimalType);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- Loop through breeds
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v_BreedCount := 1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; While v_XML.existsNode(&#039;/Data/Animals/Animal[&#039;||v_AnimalCount||&#039;]/BreedList/Breed[&#039;||v_BreedCount||&#039;]&#039;) = 1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loop
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v_Breed&nbsp;&nbsp;&nbsp;&nbsp; :=&nbsp;&nbsp;v_XML.extract(&#039;/Data/Animals/Animal[&#039;||v_AnimalCount||&#039;]/BreedList/Breed[&#039;||v_BreedCount||&#039;]/text()&#039;).getStringVal();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;Breed: &#039;||v_Breed);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Insert into BREEDS values (v_AnimalID,v_Breed);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v_BreedCount := v_BreedCount + 1;
&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end loop;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v_BreedCount := 1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v_AnimalCount := v_AnimalCount + 1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end loop;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v_AnimalCount := 1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;Moving file &#039;||i.filename);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;move_os_file(&#039;XML_INBOUND&#039;,i.filename,&#039;XML_ARCHIVE&#039;,i.filename);

&nbsp;&nbsp; end loop;

&nbsp;&nbsp; Commit;

End process_xml;
/
</code></pre></p>
<p>And that&#8217;s it! Now, let&#8217;s execute it and see what happens <img src='http://www.oracletool.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Note: My xml file is called test1.xml</p>
<p><pre><code>
10:46:41 DEMO (ADAM) &gt; Exec process_xml;
Getting directory listing
Filename: test1.xml
OS directory: /tmp/xml_inbound
Oracle directory: XML_INBOUND
File: test1.xml
Opening lob
Loading lob
File loaded
Getting Batch ID
Getting Animal Count
Batch ID: Batch 1
Animal Count: 2
Breed Count: 6
AnimalID: 1
AnimalType: Dog
Breed: Bullmastiff
Breed: Dalmation
Breed: American Bulldog
AnimalID: 2
AnimalType: Cat
Breed: Tabby
Breed: Manx
Breed: Savannah
Moving file test1.xml
</code></pre></p>
<p>Is the data there?</p>
<p><pre><code>
10:49:03 RMAN (ADAM) &gt; Select count(*) from animals;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2

10:49:11 RMAN (ADAM) &gt; Select count(*) from breeds;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6
</code></pre></p>
<p>Yep!</p>
<p>And if you look at /tmp/xml_archive..<br />
<pre><code>
[oracle@mastiff /home/oracle] [RMAN]$ ls /tmp/xml_archive
test1.xml
</code></pre></p>
<p>The file has been moved! That&#8217;s all folks!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.oracletool.com/blog/how-to-read-xml-files-from-the-os-parse-them-and-load-the-data-into-oracle/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Oracletool v2.3.3 released!</title>
		<link>http://www.oracletool.com/blog/oracletool-v2-3-3-released/</link>
		<comments>http://www.oracletool.com/blog/oracletool-v2-3-3-released/#comments</comments>
		<pubDate>Fri, 24 Feb 2012 23:26:43 +0000</pubDate>
		<dc:creator>Adam vonNieda</dc:creator>
				<category><![CDATA[Oracletool]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.oracletool.com/blog/?p=9</guid>
		<description><![CDATA[Not a lot added to this version in terms of functionality, but lots under the covers. Much cleanup was done in terms of checking for older versions of Oracle, all the way back to version 7. Oracletool is showing her &#8230; <a href="http://www.oracletool.com/blog/oracletool-v2-3-3-released/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Not a lot added to this version in terms of functionality, but lots under the covers. Much cleanup was done in terms of checking for older versions of Oracle, all the way back to version 7. Oracletool is showing her age..</p>
<p>No longer testing with Oracle 7 / 8 / 9 / 10, and queries no longer tailored for these versions.</p>
<p>Enhancements<br />
============</p>
<p>Added search for constraints to search box.<br />
Added additional info when displaying user account info</p>
<p>Bug fixes<br />
=========</p>
<p>Fixed bug where passwords were being truncated to 20 characters in password entry box.<br />
Thanks to Jim Bouma for pointing it out.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.oracletool.com/blog/oracletool-v2-3-3-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
