<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title>Blog - Rajiv Sharma</title>
    <link>http://www.rajivsharma.com/blog/</link>
    <description>Summary of the latest Articles/Blogs Published on www.rajivsharma.com</description>
    <language>en</language>
    <copyright>Copyright © rajivsharma.com, 2009</copyright>
    <generator>rajivsharma.com RSS Feed Generator v1.0</generator>
    <webMaster>Rajiv Sharma</webMaster>
    <lastBuildDate>Tue, 07 Sep 2010 07:02:37 GMT</lastBuildDate>
    <ttl>20</ttl>
    <item>
      <title>How to create an Oracle PL/SQL package body</title>
      <link>/blog/10/sql-serever-oracle-plsql/93/how-to-create-an-oracle-plsql-package-body.aspx</link>
      <description>&lt;P id=res style="FONT-FAMILY: arial,sans-serif"&gt;&lt;DIV style="FONT-FAMILY: arial,sans-serif"&gt;&lt;DIV class=g&gt;There are many benefits to encapsulating PL/SQL functions and stored procedures into packages:&lt;/FONT&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Better PL/SQL performance. Oracle stored procedures load once into the shared pool and remain there unless they become paged out. &lt;BR&gt;&amp;nbsp; &lt;BR&gt;Coupling of data with methods. DBAs can use naming conventions with Oracle packages to couple tables with the PL/SQL associated with a table, essentially using Oracle stored procedures as "methods". &lt;BR&gt;&amp;nbsp; &lt;BR&gt;Isolation of PL/SQL code. Since all PL/SQL anonymous blocks are moved out of the external programs and into the Oracle stored procedures, the application programs become nothing more than calls to stored procedures. As such, it becomes very simple to swap out one database and swap in another one. &lt;BR&gt;One of the foremost reasons PL/SQL packages function faster than traditional code is related to caching in the Oracle SGA. Once loaded into the RAM memory of the shared pool, PL/SQL packages will execute very quickly.&lt;BR&gt;&lt;BR&gt;The package body includes the definition of procedures and functions declared in the package spec and, like the package spec, can also include variables, constants, user-defined exceptions, and user-defined datatypes.&lt;BR&gt;&lt;BR&gt;Unlike objects created in a PL/SQL package specification, variables and other constructs defined within a package body are private to the package body. These constructs can only be referenced by procedures and functions within the package body.&amp;nbsp; Stored procedures are created inside a package without using the CREATE PROCEDURE command. Instead, a procedure’s definition is defined as part of the CREATE PACKAGE BODY command.&lt;/P&gt;&lt;P&gt;Here is an example of the Oracle create package body command:&lt;/P&gt;&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&lt;SPAN style="BACKGROUND-COLOR: #00ffff"&gt;CREATE OR REPLACE PACKAGE BODY emp_mgmt AS &lt;BR&gt;&lt;EM style="FONT-STYLE: normal"&gt;tot_emps NUMBER;&lt;/EM&gt; &lt;BR&gt;&lt;EM style="FONT-STYLE: normal"&gt;tot_depts NUMBER;&lt;/EM&gt; &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="BACKGROUND-COLOR: #ffff00"&gt;&lt;EM style="FONT-STYLE: normal"&gt;FUNCTION hire&lt;/EM&gt; &lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;. . &lt;BR&gt;&lt;EM style="FONT-STYLE: normal"&gt;RETURN(new_empno);&lt;/EM&gt; &lt;BR&gt;&lt;EM style="FONT-STYLE: normal"&gt;END;&lt;/EM&gt; &lt;BR&gt;&lt;SPAN style="BACKGROUND-COLOR: #ffff00"&gt;&lt;EM style="FONT-STYLE: normal"&gt;FUNCTION create_dept(department_id NUMBER, location_id NUMBER)&lt;/EM&gt; &lt;BR&gt;&lt;EM style="FONT-STYLE: normal"&gt;RETURN NUMBER IS&lt;/EM&gt; &lt;BR&gt;&lt;EM style="FONT-STYLE: normal"&gt;&amp;nbsp;&amp;nbsp; new_deptno NUMBER;&lt;/EM&gt; &lt;BR&gt;&lt;EM style="FONT-STYLE: normal"&gt;BEGIN&lt;/EM&gt; &lt;/SPAN&gt;&lt;BR&gt;&lt;EM style="FONT-STYLE: normal"&gt;&amp;nbsp;&amp;nbsp; SELECT &lt;/EM&gt;&amp;nbsp;. . . &lt;BR&gt;&lt;EM style="FONT-STYLE: normal"&gt;END;&lt;/EM&gt; &lt;BR&gt;&lt;SPAN style="BACKGROUND-COLOR: #ffff00"&gt;&lt;EM style="FONT-STYLE: normal"&gt;PROCEDURE remove_emp (employee_id NUMBER) IS&lt;/EM&gt; &lt;BR&gt;&lt;EM style="FONT-STYLE: normal"&gt;BEGIN&lt;/EM&gt; &lt;/SPAN&gt;&lt;BR&gt;&lt;EM style="FONT-STYLE: normal"&gt;&amp;nbsp;&amp;nbsp; DELETE . . . &lt;/EM&gt;&lt;BR&gt;&lt;EM style="FONT-STYLE: normal"&gt;END;&lt;/EM&gt; &lt;BR&gt;&lt;SPAN style="BACKGROUND-COLOR: #ffff00"&gt;&lt;EM style="FONT-STYLE: normal"&gt;PROCEDURE remove_dept(department_id NUMBER) IS&lt;/EM&gt; &lt;BR&gt;&lt;EM style="FONT-STYLE: normal"&gt;BEGIN&lt;/EM&gt; &lt;/SPAN&gt;&lt;BR&gt;&lt;EM style="FONT-STYLE: normal"&gt;&amp;nbsp;&amp;nbsp; DELETE FROM&amp;nbsp; . . &lt;BR&gt;END;&lt;/EM&gt; &lt;BR&gt;&lt;SPAN style="BACKGROUND-COLOR: #ffff00"&gt;&lt;EM style="FONT-STYLE: normal"&gt;PROCEDURE increase_sal(employee_id NUMBER, salary_incr NUMBER) IS&lt;/EM&gt; &lt;BR&gt;&lt;EM style="FONT-STYLE: normal"&gt;curr_sal NUMBER;&lt;/EM&gt; &lt;BR&gt;&lt;EM style="FONT-STYLE: normal"&gt;BEGIN&lt;/EM&gt; &lt;/SPAN&gt;&lt;BR&gt;&lt;EM style="FONT-STYLE: normal"&gt;&amp;nbsp;&amp;nbsp; SELECT&amp;nbsp; . . &lt;BR&gt;END;&lt;/EM&gt; &lt;BR&gt;&lt;SPAN style="BACKGROUND-COLOR: #ffff00"&gt;&lt;EM style="FONT-STYLE: normal"&gt;PROCEDURE increase_comm(employee_id NUMBER, comm_incr NUMBER) IS&lt;/EM&gt; &lt;BR&gt;&lt;EM style="FONT-STYLE: normal"&gt;curr_comm NUMBER;&lt;/EM&gt; &lt;BR&gt;&lt;EM style="FONT-STYLE: normal"&gt;BEGIN&lt;/EM&gt; &lt;/SPAN&gt;&lt;BR&gt;&lt;EM style="FONT-STYLE: normal"&gt;&amp;nbsp;&amp;nbsp; SELECT&amp;nbsp; . . &lt;BR&gt;END;&lt;/EM&gt; &lt;BR&gt;&lt;SPAN style="BACKGROUND-COLOR: #00ffff"&gt;&lt;EM style="FONT-STYLE: normal"&gt;END emp_mgmt;&lt;/EM&gt; &lt;/SPAN&gt;&lt;BR&gt;/ &lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The DBA will be required to alter a package when there are changes to tables, views, sequences, and so on that the package procedures and functions reference. This is accomplished through the use of the CREATE OR REPLACE PACKAGE [BODY] form of the CREATE PACKAGE command.&lt;/P&gt;&lt;P&gt;From www.dba-oracle.com&lt;/P&gt;&lt;P&gt;&lt;FONT size=5&gt;&lt;FONT size=2&gt;Using Oracle Supplied Packages&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;Most Oracle supplied packages are automatically installed when the database is created and the CATPROC.SQL script is run. For example, to create the DBMS_ALERT package, the DBMSALRT.SQL and PRVTALRT.PLB scripts must be run when connected as the user SYS. These scripts are run automatically by the CATPROC.SQL script.&lt;/P&gt;&lt;P&gt;Certain packages are not installed automatically. Special installation instructions for these packages are documented in the individual chapters.&lt;/P&gt;&lt;P&gt;To call a PL/SQL function from SQL, you must either own the function or have EXECUTE privileges on the function. To select from a view defined with a PL/SQL function, you must have SELECT privileges on the view. No separate EXECUTE privileges are needed to select from the view.&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Creating New Packages&lt;/STRONG&gt;&lt;/P&gt;&lt;A name=1018654&gt;&lt;/A&gt;&lt;P class=BP&gt;To create packages and store them permanently in an Oracle database, use the &lt;CODE&gt;CREATE&lt;/CODE&gt; &lt;CODE&gt;PACKAGE&lt;/CODE&gt; and &lt;CODE&gt;CREATE&lt;/CODE&gt; &lt;CODE&gt;PACKAGE&lt;/CODE&gt; &lt;CODE&gt;BODY&lt;/CODE&gt; statements. You can execute these statements interactively from SQL*Plus or Enterprise Manager.&lt;/P&gt;&lt;A name=1016283&gt;&lt;/A&gt;&lt;P class=BP&gt;To create a new package, do the following:&lt;/P&gt;&lt;OL class=LN1 type=1&gt;&lt;LI class=LN1 type=1 value=1&gt;&lt;A name=1016284&gt;&lt;/A&gt;Create the package specification with the &lt;CODE&gt;CREATE&lt;/CODE&gt; &lt;CODE&gt;PACKAGE&lt;/CODE&gt; statement. &lt;P&gt;&lt;A name=1016623&gt;&lt;/A&gt;&lt;/P&gt;&lt;P class=BP1&gt;You can declare program objects in the package specification. Such objects are called &lt;EM class=Italic&gt;public&lt;/EM&gt; objects. Public objects can be referenced outside the package, as well as by other objects in the package.&lt;/P&gt;&lt;DIV align=center&gt;&lt;TABLE class=Note dir=ltr title="This is a layout table to format a note" cellSpacing=0 cellPadding=0 width="80%" summary="This is a layout table to format a note" border=0&gt;&lt;TBODY&gt;&lt;TR class=Note&gt;&lt;TD class=Note&gt;&lt;FONT face="Arial, Helvetica, sans-serif"&gt;&lt;STRONG class=NH&gt;Note:&lt;/STRONG&gt;&lt;/FONT&gt; &lt;A name=1016732&gt;&lt;/A&gt;&lt;P class=NB&gt;It is often more convenient to add the &lt;CODE&gt;OR&lt;/CODE&gt; &lt;CODE&gt;REPLACE&lt;/CODE&gt; clause in the &lt;CODE&gt;CREATE&lt;/CODE&gt; &lt;CODE&gt;PACKAGE&lt;/CODE&gt; statement.&lt;BR&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;&lt;LI class=LN1 type=1 value=2&gt;&lt;A name=1016734&gt;&lt;/A&gt;Create the package body with the &lt;CODE&gt;CREATE&lt;/CODE&gt; &lt;CODE&gt;PACKAGE&lt;/CODE&gt; &lt;CODE&gt;BODY&lt;/CODE&gt; statement. &lt;P&gt;&lt;A name=1016735&gt;&lt;/A&gt;&lt;/P&gt;&lt;P class=BP1&gt;You can declare and define program objects in the package body.&lt;/P&gt;&lt;UL class=LB2&gt;&lt;LI class=LB2 type=disc&gt;&lt;A name=1016286&gt;&lt;/A&gt;You must define public objects declared in the package specification. &lt;LI class=LB2 type=disc&gt;&lt;A name=1016340&gt;&lt;/A&gt;You can declare and define additional package objects, called &lt;EM class=Italic&gt;private&lt;/EM&gt; objects. Private objects are declared in the package body rather than in the package specification, so they can be referenced only by other objects in the package. They cannot be referenced outside the package.&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;P class=LB2&gt;&lt;STRONG&gt;Separating the Specification and Body&lt;/STRONG&gt;&lt;/P&gt;&lt;A name=1016235&gt;&lt;/A&gt;&lt;P class=BP&gt;The specification of a package declares the public types, variables, constants, and subprograms that are visible outside the immediate scope of the package. The body of a package defines the objects declared in the specification, as well as private objects that are not visible to applications outside the package.&lt;/P&gt;&lt;A name=1016298&gt;&lt;/A&gt;&lt;P class=BP&gt;Oracle stores the specification and body of a package separately in the database. Other schema objects that call or reference public program objects depend only on the package specification, not on the package body. Using this distinction, you can change the definition of a program object in the package body without causing Oracle to invalidate other schema objects that call or reference the program object. Oracle invalidates dependent schema objects only if you change the declaration of the program object in the package specification.&lt;/P&gt;&lt;DIV align=left&gt;&lt;BR&gt;&lt;STRONG&gt;Referencing Package Contents&lt;BR&gt;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV align=center&gt;To reference the types, items, and subprograms declared in a package specification, use the dot notation. For example:&lt;/DIV&gt;&lt;PRE class=CE&gt;&lt;A name=1016719&gt;&lt;/A&gt;package_name.type_name&lt;A name=1016720&gt;&lt;/A&gt;package_name.item_name&lt;A name=1016721&gt;&lt;/A&gt;package_name.subprogram_name&lt;/PRE&gt;&lt;PRE class=CE&gt;From cs.scu.edu.cn&lt;/PRE&gt;&lt;br/&gt;Blog Posted on: &lt;b&gt;Thursday, February 19, 2009 at 04:29-PM&lt;/b&gt;</description>
      <author>Rajiv Sharma</author>
      <pubDate>Thu, 19 Feb 2009 16:29:07 GMT</pubDate>
      <subject>Thursday, February 19, 2009 at 04:29-PM</subject>
    </item>
    <item>
      <title>How to Escape Characters in Oracle PL/SQL Queries</title>
      <link>/blog/10/sql-serever-oracle-plsql/98/how-to-escape-characters-in-oracle-plsql-queries.aspx</link>
      <description>&lt;P&gt;Oracle databases reserve some special characters with specific meaning and purpose within Oracle environment. These reserved characters include _ (underscore) wild card character which used to match exactly one character, % (percentage) which used to match zero or more occurrences of any characters and ‘ (apostrophe or quotation mark) which used to mark the value supplied. These special characters will not be interpreted literally when building SQL query in Oracle, and may caused error in results returned especially when performing string search with LIKE keyword. To use these characters so that Oracle can interpret them literally as a part of string value instead of preset mean, escape character has to be assigned.&lt;/P&gt;&lt;P&gt;Oracle allows the assignment of special escape characters to the reserved characters in Oracle can be escaped to normal characters that is interpreted literally, by using ESCAPE keyword.&lt;/P&gt;&lt;P&gt;For example, to select the name of guests with _ (underscore) in it, use the following statement:&lt;/P&gt;&lt;P&gt;SELECT guest_name FROM guest_table WHERE name LIKE ‘%\_%’ ESCAPE ‘\’;&lt;/P&gt;&lt;P&gt;Without specifying the \ (backslash) as escape clause, the query will return all guest names, making the unwanted results problem.&lt;/P&gt;&lt;P&gt;The above syntax will not work on ‘ (quote). To escape this quotation mark and to display the quote literally in string, insert another quote (total 2 quotes) for every quote that want to be displayed. For example:&lt;/P&gt;&lt;P&gt;SELECT ‘This will display line with quote’’s word.’ FROM temp_table;&lt;BR&gt;SELECT ‘This will display ””double quoted”” word.’ FROM temp_table;&lt;/P&gt;&lt;P&gt;will return the following respectively:&lt;/P&gt;&lt;P&gt;This will display line with quote’s word.&lt;BR&gt;This will display ”double quoted” word.&lt;/P&gt;&lt;P&gt;From www.mydigitallife.info&lt;/P&gt;&lt;br/&gt;Blog Posted on: &lt;b&gt;Friday, February 20, 2009 at 03:14-PM&lt;/b&gt;</description>
      <author>Rajiv Sharma</author>
      <pubDate>Fri, 20 Feb 2009 15:14:04 GMT</pubDate>
      <subject>Friday, February 20, 2009 at 03:14-PM</subject>
    </item>
    <item>
      <title>How to Find and Replace Text in MySQL Database using SQL</title>
      <link>/blog/10/sql-serever-oracle-plsql/99/how-to-find-and-replace-text-in-mysql-database-using-sql.aspx</link>
      <description>&lt;P&gt;MySQL database has a handy and simple string function REPLACE() that allows table data with the matching string (from_string) to be replaced by new string (to_string). This is useful if there is need to search and replace a text string which affects many records or rows, such as change of company name, postcode, URL or spelling mistake.&lt;BR&gt;&lt;SPAN id=more-3157&gt;&lt;/SPAN&gt;&lt;BR&gt;The syntax of REPLACE is REPLACE(text_string, from_string, to_string)&lt;/P&gt;&lt;P&gt;&lt;A class=tdBlogPostContentsLinks href="http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_replace"&gt;MySQL reference&lt;/A&gt; describes REPLACE as function that returns the string text_string with all occurrences of the string from_string replaced by the string to_string, where matching is case-sensitive when searching for from_string. text_string can be retrieved from the a field in the database table too. Most SQL command can be REPLACE() function, especially SELECT and UPDATE manipulation statement.&lt;/P&gt;&lt;P&gt;For example:&lt;/P&gt;&lt;P&gt;update TABLE_NAME set FIELD_NAME = replace(FIELD_NAME, ‘find this string’, ‘replace found string with this string’);&lt;/P&gt;&lt;P&gt;update client_table set company_name = replace(company_name, ‘Old Company’, ‘New Company’)&lt;/P&gt;&lt;P&gt;The above statement will replace all instances of ‘Old Company’ to ‘New Company’ in the field of company_name of client_table table.&lt;/P&gt;&lt;P&gt;Another example:&lt;/P&gt;&lt;P&gt;SELECT REPLACE(’www.mysql.com’, ‘w’, ‘Ww’);&lt;/P&gt;&lt;P&gt;Above statement will return ‘WwWwWw.mysql.com’ as result.&lt;/P&gt;&lt;P&gt;From www.mydigitallife.info&lt;/P&gt;&lt;br/&gt;Blog Posted on: &lt;b&gt;Friday, February 20, 2009 at 03:14-PM&lt;/b&gt;</description>
      <author>Rajiv Sharma</author>
      <pubDate>Fri, 20 Feb 2009 15:14:04 GMT</pubDate>
      <subject>Friday, February 20, 2009 at 03:14-PM</subject>
    </item>
    <item>
      <title>Oracle Create Sequence</title>
      <link>/blog/10/sql-serever-oracle-plsql/100/oracle-create-sequence.aspx</link>
      <description>&lt;P class=style3&gt;The oracle docs note the syntax for the Oracle CREATE SEQUENCE function as follows:&lt;/P&gt;&lt;P class=BodyText&gt;&lt;FONT size=2&gt;CREATE SEQUENCE [ schema. ]sequence&lt;BR&gt;&amp;nbsp;&amp;nbsp; [ { INCREMENT BY | START WITH } integer&lt;BR&gt;&amp;nbsp;&amp;nbsp; | { MAXVALUE integer | NOMAXVALUE }&lt;BR&gt;&amp;nbsp;&amp;nbsp; | { MINVALUE integer | NOMINVALUE }&lt;BR&gt;&amp;nbsp;&amp;nbsp; | { CYCLE | NOCYCLE }&lt;BR&gt;&amp;nbsp;&amp;nbsp; | { CACHE integer | NOCACHE }&lt;BR&gt;&amp;nbsp;&amp;nbsp; | { ORDER | NOORDER }&lt;BR&gt;&amp;nbsp;&amp;nbsp; ]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ { INCREMENT BY | START WITH } integer&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | { MAXVALUE integer | NOMAXVALUE }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | { MINVALUE integer | NOMINVALUE }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | { CYCLE | NOCYCLE }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | { CACHE integer | NOCACHE }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | { ORDER | NOORDER }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ]... ;&lt;/FONT&gt;&lt;/P&gt;&lt;P class=BodyText&gt;&lt;FONT size=2&gt;Let's look at this example&lt;/FONT&gt; for using the Oracle CREATE SEQUENCE:&lt;/P&gt;&lt;P class=CodeResults&gt;&lt;FONT class=style2 face="Courier New" size=2&gt;SQL&amp;gt; create sequence pubs1;&lt;BR&gt;&lt;BR&gt;Sequence created.&lt;/FONT&gt;&lt;/P&gt;&lt;P class=style2&gt;&lt;FONT face="Courier New"&gt;SQL&amp;gt; select pubs1.nextval from dual;&lt;/FONT&gt;&lt;/P&gt;&lt;P class=CodeResults&gt;&lt;FONT class=style2 face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp; NEXTVAL&lt;BR&gt;----------&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;/FONT&gt;&lt;/P&gt;&lt;P class=style2&gt;&lt;FONT face="Courier New"&gt;SQL&amp;gt; select pubs1.nextval from dual;&lt;/FONT&gt;&lt;/P&gt;&lt;P class=CodeResults&gt;&lt;FONT class=style2 face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp; NEXTVAL&lt;BR&gt;----------&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&lt;/FONT&gt;&lt;/P&gt;&lt;P class=BodyText&gt;In the example above, we used CREATE SEQUENCE to create a sequence called &lt;I&gt;pubs1&lt;/I&gt;.&amp;nbsp; We use the NEXTVAL function to retrieve the next value.&amp;nbsp; You can get the current value by calling the CURRVAL function.&amp;nbsp;&amp;nbsp; You must call the NEXTVAL function before calling the CURRVAL function, or you will get an error.&amp;nbsp; There is no current value to the sequence until the next value has been called at least once.&lt;/P&gt;&lt;P class=BodyText&gt;When you use Oracle CREATE SEQUENCE to create the sequence, you have a lot of flexibility as to how the sequence generates the next number.&lt;/P&gt;&lt;P class=CodeResults&gt;&lt;FONT class=style2 face="Courier New" size=1&gt;&lt;FONT size=2&gt;SQL&amp;gt; create sequence pubs2&lt;BR&gt;&amp;nbsp; 2&amp;nbsp; start with 8&lt;BR&gt;&amp;nbsp; 3&amp;nbsp; increment by 2&lt;BR&gt;&amp;nbsp; 4&amp;nbsp; maxvalue 10000&lt;BR&gt;&amp;nbsp; 5&amp;nbsp; cycle&lt;BR&gt;&amp;nbsp; 6&amp;nbsp; cache 5;&lt;/FONT&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;&lt;P class=style2&gt;&lt;FONT face="Courier New"&gt;Sequence created.&lt;/FONT&gt;&lt;/P&gt;&lt;P class=style2&gt;&lt;FONT face="Courier New"&gt;SQL&amp;gt; select pubs2.nextval from dual;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;&lt;P class=CodeResults&gt;&lt;FONT class=style2 face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp; NEXTVAL&lt;BR&gt;----------&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;P class=BodyText&gt;In this example, using Oracle CREATE SEQUENCE, the sequence &lt;I&gt;pubs2&lt;/I&gt; will start at number eight and increment by twos to 10000 and then start over.&amp;nbsp; Let’s cover each of their parameters:&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;FONT face=Arial&gt;INCREMENT BY&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;Specify the interval between sequence numbers. This integer value can be any positive or negative integer, but it cannot be 0. This value can have 28 or fewer digits. The absolute of this value must be less than the difference of &lt;CODE&gt;MAXVALUE&lt;/CODE&gt; and &lt;CODE&gt;MINVALUE&lt;/CODE&gt;. If this value is negative, then the sequence descends. If the value is positive, then the sequence ascends. If you omit this clause, then the interval defaults to 1.&lt;/P&gt;&lt;P class=BodyText&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;FONT face="arial, helvetica, sans-serif"&gt;START WITH&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;Specify the first sequence number to be generated. Use this clause to start an ascending sequence at a value greater than its minimum or to start a descending sequence at a value less than its maximum. For ascending sequences, the default value is the minimum value of the sequence. For descending sequences, the default value is the maximum value of the sequence. This integer value can have 28 or fewer digits.&lt;/P&gt;&lt;P&gt;&lt;FONT face="arial, helvetica, sans-serif" size=2&gt;&lt;STRONG&gt;Note:&lt;BR&gt;&lt;BR&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;This value is not necessarily the value to which an ascending cycling sequence cycles after reaching its maximum or minimum value.&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;FONT face="arial, helvetica, sans-serif"&gt;MAXVALUE&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;Specify the maximum value the sequence can generate. This integer value can have 28 or fewer digits. &lt;CODE&gt;MAXVALUE&lt;/CODE&gt; must be equal to or greater than &lt;CODE&gt;START&lt;/CODE&gt; &lt;CODE&gt;WITH&lt;/CODE&gt; and must be greater than &lt;CODE&gt;MINVALUE&lt;/CODE&gt;.&lt;/P&gt;&lt;P class=BodyText&gt;&lt;STRONG&gt;&lt;FONT face="arial, helvetica, sans-serif"&gt;NOMAXVALUE&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;Specify &lt;CODE&gt;NOMAXVALUE&lt;/CODE&gt; to indicate a maximum value of 10&lt;SUP&gt;27&lt;/SUP&gt; for an ascending sequence or -1 for a descending sequence. This is the default.&lt;/P&gt;&lt;P class=BodyText&gt;&lt;STRONG&gt;&lt;FONT face="arial, helvetica, sans-serif"&gt;MINVALUE&lt;A id=sthref5334 name=sthref5334&gt;&lt;/A&gt;&lt;A id=sthref5335 name=sthref5335&gt;&lt;/A&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;BR&gt;&lt;BR&gt;Specify the minimum value of the sequence. This integer value can have 28 or fewer digits. &lt;CODE&gt;MINVALUE&lt;/CODE&gt; must be less than or equal to &lt;CODE&gt;START&lt;/CODE&gt; &lt;CODE&gt;WITH&lt;/CODE&gt; and must be less than &lt;CODE&gt;MAXVALUE&lt;/CODE&gt;.&lt;/P&gt;&lt;P class=BodyText&gt;&lt;STRONG&gt;&lt;FONT face="arial, helvetica, sans-serif"&gt;NOMINVALUE&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;Specify &lt;CODE&gt;NOMINVALUE&lt;/CODE&gt; to indicate a minimum value of 1 for an ascending sequence or -10&lt;SUP&gt;26&lt;/SUP&gt; for a descending sequence. This is the default.&lt;/P&gt;&lt;P class=BodyText&gt;&lt;STRONG&gt;&lt;FONT face="arial, helvetica, sans-serif"&gt;CYCLE&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;Specify &lt;CODE&gt;CYCLE&lt;/CODE&gt; to indicate that the sequence continues to generate values after reaching either its maximum or minimum value. After an ascending sequence reaches its maximum value, it generates its minimum value. After a descending sequence reaches its minimum, it generates its maximum value.&lt;/P&gt;&lt;P class=BodyText&gt;&lt;STRONG&gt;&lt;FONT face="arial, helvetica, sans-serif"&gt;NOCYCLE&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;Specify &lt;CODE&gt;NOCYCLE&lt;/CODE&gt; to indicate that the sequence cannot generate more values after reaching its maximum or minimum value. This is the default.&lt;/P&gt;&lt;P class=BodyText&gt;&lt;STRONG&gt;&lt;FONT face="arial, helvetica, sans-serif"&gt;CACHE&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;Specify how many values of the sequence the database preallocates and keeps in memory for faster access. This integer value can have 28 or fewer digits. The minimum value for this parameter is 2. For sequences that cycle, this value must be less than the number of values in the cycle. You cannot cache more values than will fit in a given cycle of sequence numbers. Therefore, the maximum value allowed for &lt;CODE&gt;CACHE&lt;/CODE&gt; must be less than the value determined by the following formula:&lt;/P&gt;&lt;PRE xml:space="preserve"&gt;(CEIL (MAXVALUE - MINVALUE)) / ABS (INCREMENT)&lt;/PRE&gt;&lt;P&gt;If a system failure occurs, all cached sequence values that have not been used in committed DML statements are lost. The potential number of lost values is equal to the value of the &lt;CODE&gt;CACHE&lt;/CODE&gt; parameter.&lt;/P&gt;&lt;P&gt;&lt;FONT face="arial, helvetica, sans-serif" size=2&gt;&lt;STRONG&gt;Note:&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;Oracle recommends using the &lt;CODE&gt;CACHE&lt;/CODE&gt; setting to enhance performance if you are using sequences in a Real Application Clusters environment.&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;FONT face="arial, helvetica, sans-serif"&gt;NOCACHE&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;Specify &lt;CODE&gt;NOCACHE&lt;/CODE&gt; to indicate that values of the sequence are not preallocated. If you omit both &lt;CODE&gt;CACHE&lt;/CODE&gt; and &lt;CODE&gt;NOCACHE&lt;/CODE&gt;, the database caches 20 sequence numbers by default.&lt;/P&gt;&lt;P class=BodyText&gt;&lt;STRONG&gt;&lt;FONT face="arial, helvetica, sans-serif"&gt;ORDER&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;Specify &lt;CODE&gt;ORDER&lt;/CODE&gt; to guarantee that sequence numbers are generated in order of request. This clause is useful if you are using the sequence numbers as timestamps. Guaranteeing order is usually not important for sequences used to generate primary keys.&lt;/P&gt;&lt;P&gt;&lt;CODE&gt;ORDER&lt;/CODE&gt; is necessary only to guarantee ordered generation if you are using Oracle Database with Real Application Clusters. If you are using exclusive mode, sequence numbers are always generated in order.&lt;/P&gt;&lt;P class=BodyText&gt;&lt;STRONG&gt;&lt;FONT face="arial, helvetica, sans-serif"&gt;NOORDER&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;Specify &lt;CODE&gt;NOORDER&lt;/CODE&gt; if you do not want to guarantee sequence numbers are generated in order of request. This is the default.&lt;/P&gt;&lt;A id=g2186875 name=g2186875&gt;&lt;/A&gt;&lt;A id=sthref5346 name=sthref5346&gt;&lt;/A&gt;&lt;P&gt;&lt;STRONG&gt;Example:&lt;BR&gt;&lt;/STRONG&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;FONT face="arial, helvetica, sans-serif"&gt;Creating a Sequence: &lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/STRONG&gt;The following statement creates the sequence &lt;CODE&gt;customers_seq&lt;/CODE&gt; in the sample schema &lt;CODE&gt;oe&lt;/CODE&gt;. This sequence could be used to provide customer ID numbers when rows are added to the &lt;CODE&gt;customers&lt;/CODE&gt; table.&lt;/P&gt;&lt;PRE xml:space="preserve"&gt;CREATE SEQUENCE customers_seq START WITH     1000 INCREMENT BY   1 NOCACHE NOCYCLE;&lt;/PRE&gt;&lt;P&gt;The first reference to &lt;CODE&gt;customers_seq.nextval&lt;/CODE&gt; returns 1000. The second returns 1001. Each subsequent reference will return a value 1 greater than the previous reference.&lt;/P&gt;&lt;br/&gt;Blog Posted on: &lt;b&gt;Saturday, February 21, 2009 at 12:35-PM&lt;/b&gt;</description>
      <author>Rajiv Sharma</author>
      <pubDate>Sat, 21 Feb 2009 12:35:55 GMT</pubDate>
      <subject>Saturday, February 21, 2009 at 12:35-PM</subject>
    </item>
    <item>
      <title>Send email from Oracle Database</title>
      <link>/blog/10/sql-serever-oracle-plsql/101/send-email-from-oracle-database.aspx</link>
      <description>&lt;P&gt;&lt;STRONG&gt;Introduction&lt;BR&gt;&lt;/STRONG&gt;This code shows how to send email using Oracle PL/SQL / Oracle Database.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Language and Platform&lt;/STRONG&gt;&lt;BR&gt;Oracle9i database server &lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Code&lt;/STRONG&gt;&lt;BR&gt;create or replace package mail_pkg&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; as&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type array is table of varchar2(255);&lt;BR&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; procedure send( p_sender_email in varchar2,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_from&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; in varchar2,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_to&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; in array default array(),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_cc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; in array default array(),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_bcc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; in array default array(),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_subject&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; in varchar2,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_body&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; in long );&lt;BR&gt;&amp;nbsp;&amp;nbsp; end;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;BR&gt;create or replace package body mail_pkg&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; as&lt;BR&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_crlf&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; char(2) default chr(13)||chr(10);&lt;BR&gt;&amp;nbsp;&amp;nbsp; g_mail_conn&amp;nbsp;&amp;nbsp; utl_smtp.connection;&lt;BR&gt;&amp;nbsp;&amp;nbsp; g_mailhost&amp;nbsp;&amp;nbsp;&amp;nbsp; varchar2(255)&amp;nbsp;:= 'chiana.kyamk.fi';&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; function address_email( p_string in varchar2,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_recipients in array ) return varchar2&lt;BR&gt;&amp;nbsp;&amp;nbsp; is&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; l_recipients long;&lt;BR&gt;&amp;nbsp;&amp;nbsp; begin&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for i in 1 .. p_recipients.count&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; loop&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; utl_smtp.rcpt(g_mail_conn, p_recipients(i) );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( l_recipients is null )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; l_recipients&amp;nbsp;:= p_string || p_recipients(i)&amp;nbsp;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; l_recipients&amp;nbsp;:= l_recipients || ', ' || p_recipients(i);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end if;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end loop;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return l_recipients;&lt;BR&gt;&amp;nbsp;&amp;nbsp; end;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp; procedure send( p_sender_email in varchar2,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_from&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; in varchar2 default NULL,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_to&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; in array default array(),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_cc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; in array default array(),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_bcc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; in array default array(),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_subject&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; in varchar2 default NULL,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_body&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; in long&amp;nbsp; default NULL )&lt;BR&gt;&amp;nbsp;&amp;nbsp; is&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; l_to_list&amp;nbsp;&amp;nbsp; long;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; l_cc_list&amp;nbsp;&amp;nbsp; long;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; l_bcc_list&amp;nbsp; long;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; l_date&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; varchar2(255) default&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; to_char( SYSDATE, 'dd Mon yy hh24:mi:ss' );&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; procedure writeData( p_text in varchar2 )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; as&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( p_text is not null )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; utl_smtp.write_data( g_mail_conn, p_text || g_crlf );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end if;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;BR&gt;&amp;nbsp;&amp;nbsp; begin&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_mail_conn&amp;nbsp;:= utl_smtp.open_connection(g_mailhost, 25);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; utl_smtp.helo(g_mail_conn, g_mailhost);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; utl_smtp.mail(g_mail_conn, p_sender_email);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; l_to_list &amp;nbsp;:= address_email( 'To: ', p_to );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; l_cc_list &amp;nbsp;:= address_email( 'Cc: ', p_cc );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; l_bcc_list&amp;nbsp;:= address_email( 'Bcc: ', p_bcc );&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; utl_smtp.open_data(g_mail_conn );&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writeData( 'Date: ' || l_date );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writeData( 'From: ' || nvl( p_from, p_sender_email ) );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writeData( 'Subject: ' || nvl( p_subject, '(no subject)' ) );&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writeData( l_to_list );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writeData( l_cc_list );&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; utl_smtp.write_data( g_mail_conn, '' || g_crlf );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; utl_smtp.write_data(g_mail_conn, p_body );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; utl_smtp.close_data(g_mail_conn );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; utl_smtp.quit(g_mail_conn);&lt;BR&gt;&amp;nbsp;&amp;nbsp; end;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp; end;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;begin&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mail_pkg.send&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( p_sender_email =&amp;gt; 'iam@rajivsharma.com',&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_from =&amp;gt; 'Oracle Database Account &amp;lt;'iam@rajivsharma.com'&amp;gt;',&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_to =&amp;gt; mail_pkg.array( 'iam@rajivsharma.com',&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'info@rajivsharma.com' ),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_cc =&amp;gt; mail_pkg.array( 'iam@rajivsharma.com' ),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_bcc =&amp;gt; mail_pkg.array( 'iam@rajivsharma.com' ),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_subject =&amp;gt; 'This is Testing',&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_body =&amp;gt; 'Hello, Testing Oracle DB Mail Sending Capabilities' );&lt;BR&gt;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;From it.toolbox.com&lt;BR&gt;&lt;/P&gt;&lt;br/&gt;Blog Posted on: &lt;b&gt;Saturday, February 21, 2009 at 12:45-PM&lt;/b&gt;</description>
      <author>Rajiv Sharma</author>
      <pubDate>Sat, 21 Feb 2009 12:45:49 GMT</pubDate>
      <subject>Saturday, February 21, 2009 at 12:45-PM</subject>
    </item>
    <item>
      <title>Sending content-type: html e-mail from an Oracle database with utl_smtp</title>
      <link>/blog/10/sql-serever-oracle-plsql/102/sending-content-type-html-e-mail-from-an-oracle-database-with-utl_smtp.aspx</link>
      <description>&lt;P&gt;If you're running Oracle 10g or later, you can use the nice modern utl_mail package to send e-mails from your PL/SQL applications. Even though the application I maintain is now running on Oracle 10g, it was built back on an Oracle 8i database, so it sends e-mails via the older (and more complicated) utl_smtp package.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Code Syntax to send Content Type HTML emails&amp;nbsp;using Oracle database:&lt;BR&gt;&lt;BR&gt;utl_smtp.write_data(c, 'Content-Type: text/html' || utl_tcp.crlf);&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;To begin, the utl_smtp package has to be installed (in the SYS schema, naturally). If it wasn't part of your install, you can find the utlsmtp.sql script in your ORACLE_HOME\RDBMS\admin directory. You'll also need utl_tcp; again, if it's not already loaded, the utltcp.sql script for that is in the same location as the utlsmtp.sql. Finally, you will need to know the URL for your corporate SMTP server. (Note: This example won't work with secured SMTP servers like Gmail.) &lt;/P&gt;&lt;P&gt;The spec for our little e-mail package is fairly straightforward: &lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;create or replace PACKAGE sendmail IS&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&amp;nbsp; procedure send (p_sender varchar2,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_recipient varchar2,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_subject varchar2,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_body varchar2 default null);&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;end sendmail;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;For the body, you'll notice that the public method send relies on a private method called common because I want to extend this package later and show how to send Binary Large OBject (blob) attachments. For example, if you've generated a PDF and stored it in your database, you might want to e-mail it as an attachment; the common method is in preparation for that. The code that will be used is from the basic send method and the send_blob method.&lt;/P&gt;&lt;P&gt;Here's the package body: &lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;create or replace PACKAGE BODY sendmail IS&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&amp;nbsp; procedure common (p_sender varchar2,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_recipient varchar2,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_subject varchar2,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c out utl_smtp.connection) is&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; v_recipient varchar2(1000);&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&amp;nbsp; begin&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --make connection to smtp&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; c := utl_smtp.open_connection('smtp.example.com');&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --identify the domain of the sender&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; utl_smtp.helo(c, 'example.com');&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --start a mail, specify the sender&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; utl_smtp.mail(c, p_sender);&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --identify recipient&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; utl_smtp.rcpt(c, v_recipient);&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --start the mail body&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; utl_smtp.open_data(c);&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; utl_smtp.write_data(c, 'From: ' || p_sender || utl_tcp.crlf);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; utl_smtp.write_data(c, 'To: ' || p_recipient || utl_tcp.crlf);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; utl_smtp.write_data(c, 'Subject: ' || p_subject || utl_tcp.crlf);&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&amp;nbsp; exception&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; when utl_smtp.transient_error or utl_smtp.permanent_error then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; utl_smtp.quit(c);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; raise;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; when others then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; raise;&lt;BR&gt;&amp;nbsp; end common;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&amp;nbsp; procedure send (p_sender varchar2,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_recipient varchar2,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_subject varchar2,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_body varchar2 default null) is&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; c utl_smtp.connection;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&amp;nbsp; begin&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; common(p_sender, p_recipient, p_subject, c);&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; utl_smtp.write_data(c, 'Content-Type: text/html' || utl_tcp.crlf);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; utl_smtp.write_data(c, utl_tcp.crlf || p_body);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; utl_smtp.close_data(c);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; utl_smtp.quit(c);&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&amp;nbsp; exception&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; when utl_smtp.transient_error or utl_smtp.permanent_error then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; utl_smtp.quit(c);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; raise;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; when others then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; raise;&lt;BR&gt;&amp;nbsp; end send;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;end sendmail;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;There are a couple of places above where you'll need to substitute your specific information. First is the line where I provide the SMTP server: &lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;    --make connection to smtp    c := utl_smtp.open_connection('smtp.example.com');&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;That's where you'll want to put whatever your corporate SMTP server happens to be. And the second place is where you identify your domain: &lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;    --identify the domain of the sender    utl_smtp.helo(c, 'example.com');&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;Again, replace that with whatever your domain really is. That's all you'll need to get the basic e-mail functionality working. &lt;/P&gt;&lt;P&gt;To call this, you'd use something like: &lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;begin&lt;BR&gt;&amp;nbsp; sendmail.send ('sender@example.com',&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'recipient@example.com',&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Subject: Testing',&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Test Email!');&lt;BR&gt;end;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;STRONG&gt;You'll notice that the body string I gave above has HTML embedded in it. This is because, in the &lt;CODE&gt;send&lt;/CODE&gt; method, I set the content type to be text/html: &lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;STRONG&gt;    utl_smtp.write_data(c, 'Content-Type: text/html' || utl_tcp.crlf);&lt;/STRONG&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;From www.builderau.com.au&lt;/CODE&gt;&lt;/PRE&gt;&lt;br/&gt;Blog Posted on: &lt;b&gt;Saturday, February 21, 2009 at 01:56-PM&lt;/b&gt;</description>
      <author>Rajiv Sharma</author>
      <pubDate>Sat, 21 Feb 2009 13:56:33 GMT</pubDate>
      <subject>Saturday, February 21, 2009 at 01:56-PM</subject>
    </item>
    <item>
      <title>Oracle Triggers</title>
      <link>/blog/10/sql-serever-oracle-plsql/119/oracle-triggers.aspx</link>
      <description>&lt;P&gt;&lt;STRONG&gt;What is a trigger?&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;A trigger is a special case of stored procedure that is fired during an event rather than being explicitly executed. A function or a procedure can be called from a command line or from within a different calling program. A trigger is called automatically when an event is fired.&lt;/P&gt;&lt;P&gt;In Oracle, a trigger can have the procedural code embedded in the body of the trigger, you can call out to another existing function or procedure, or a combination of both. The code in a trigger is generally the same as any procedure or function. You are allowed to create Java triggers but I see this rarely in live systems.&lt;/P&gt;&lt;P&gt;You cannot execute transaction control statements with in a trigger. That means no commits or rollbacks. If you need to rollback a transaction due to logic in a trigger, raise an exception and allow the calling program to take the appropriate action. As for commits, the calling application should always commit or rollback as needed.&lt;/P&gt;&lt;P&gt;Technically, there is a way to execute transaction control within a trigger but that can be abused, and really damage your data integrity, if done poorly. I will leave that topic for a discussion on advanced PL/SQL.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;What are trigger events?&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;Various databases support different triggering events. Most all enterprise class databases support DML triggers (excluding SELECT). That means that the database will optionally fire anytime a table has a row updated, deleted or inserted. Many databases, including Oracle, also support DDL triggers. These fire when you create, alter or drop an object.&lt;/P&gt;&lt;P&gt;Oracle supports many events in addition to DML events. Oracle supports system events such as the database starting or stopping or when there is a server error. Oracle also supports user events such as a user logging on or off.&lt;/P&gt;&lt;P&gt;For a new user or developer, it is important that you understand DML triggers as you will find many applications that are Dependant on triggers. DDL, user and system triggers tend to have more advanced uses although you will see examples of those for various security related processing (such as VPD).&lt;/P&gt;&lt;P&gt;For the purpose of this blog entry, I'll stick to DML triggers.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Trigger Syntax&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;There are three main types of DML triggers: before, after and instead of. A before or after trigger can be a statement level trigger or a row level trigger.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Before&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;Obviously, a before statement trigger will fire before a statement is executed. A before row level trigger fires before each row that is affected by a statement.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;After&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;An after statement trigger will fire after a statement is fired. A before row level trigger fires before each row that is affected by a statement.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Statement vs Row&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;The difference between a statement level trigger and a row level trigger is very easy to understand. If you perform an update that will affect 10 rows, a statement level trigger will fire once and a row level trigger will fire 10 times.&lt;/P&gt;&lt;P&gt;A statement level trigger does not have access to individual column values. A row level trigger does have access to column values. A before row trigger can change new column values.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Instead Of&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;An instead of trigger is built on a view. Many views are updateable with an instead of trigger. Many more views are not updateable for various reasons. With an instead of trigger, you can update any of these views. As the name implies, an instead of trigger is executed instead of Oracle trying to execute the command directly against the view.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Trigger Syntax&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;The syntax of a trigger varies database by database but for Oracle and PL/SQL (as well as for EnterpriseDB and SPL), the basic syntax of a DML trigger is:&lt;/P&gt;&lt;PRE&gt;&lt;FONT face="Times New Roman"&gt;CREATE OR REPLACE TRIGGER trigger_name&lt;BR&gt;&amp;nbsp; BEFORE|AFTER|INSTEAD OF&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp; INSERT|DELETE|UPDATE ON table_name &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [OF column_names]&lt;BR&gt;&amp;nbsp; [REFERENCING [NEW AS new_cols] [OLD AS old_cols]]&lt;BR&gt;&amp;nbsp; [FOR EACH ROW [WHEN (where_condition)]]&lt;BR&gt;&amp;nbsp; [DECLARE]&lt;BR&gt;&amp;nbsp; BEGIN&lt;BR&gt;&amp;nbsp; EXCEPTION&lt;BR&gt;&amp;nbsp; END; &lt;BR&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;P&gt;Let's look at the command row by row. Anything within square brackets ([]) is an optional clause. Any items delimited with a pipe (|) is part of a list.&lt;/P&gt;&lt;P&gt;Row 1: The create or replace should seem familiar if you are familiar with procedures and functions. Naming of a trigger follows standard naming conventions and rules.&lt;/P&gt;&lt;P&gt;Row 2: The BEFORE|AFTER|INSTEAD OF clause tells the database what type of trigger it will be.&lt;/P&gt;&lt;P&gt;Row 3: This line allows you define if the triggering event will be on UPDATE, DELETE, INSERT, a combination or all of these. The "ON table_name" identifies the table for which the trigger will be created.&lt;/P&gt;&lt;P&gt;Row 4: An optional clause is the "OF column_names". This statement only affects an UPDATE. If you only want to fire an update trigger when certain columns are modified, you may include this optional statement and list the columns that should be monitored.&lt;/P&gt;&lt;P&gt;Row 5: In a row level trigger, you have the values of the columns as they existed before the command and the new values as a result of the command. For an insert, there are no old values and for a delete, there are no new values. In an update, you have both old and new.&lt;/P&gt;&lt;P&gt;The REFERENCING clause allows you to name the old row and the new row. By default, they are named :OLD and :NEW. You refer to them as :OLD.column_name and :NEW.column_name. You can query them in both before and after row triggers, like:&lt;/P&gt;&lt;P&gt;IF :old.gl_id = :new.gl_id THEN...&lt;/P&gt;&lt;P&gt;In a before row trigger, you can even set the values of :new columns, i.e.&lt;/P&gt;&lt;P&gt;:new.gl_id := sequence.nextval();&lt;/P&gt;&lt;P&gt;Statement level triggers cannot access row level column data.&lt;/P&gt;&lt;P&gt;Row 6: A DML trigger, by default, is a statement level trigger. When you use "FOR EACH ROW", you turn it into a row level trigger.&lt;/P&gt;&lt;P&gt;The WHEN clause allows you to introduce additional matching criteria that Oracle will test before executing a trigger. It is standard where clause type criteria,&lt;/P&gt;&lt;P&gt;FOR EACH ROW WHEN (old.order_date BETWEEN sysdate - 10 and sysdate)&lt;/P&gt;&lt;P&gt;Row 7 and on are standard PL/SQL syntax. Think of them as an anonymous block attached to the trigger name and criteria.&lt;BR&gt;&lt;BR&gt;Example&lt;/P&gt;&lt;P&gt;Here is a very simple trigger using the Employees table from Oracle XE.&lt;/P&gt;&lt;P&gt;SQL&amp;gt; desc employees&lt;BR&gt;&amp;nbsp;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Null?&amp;nbsp;&amp;nbsp;&amp;nbsp; Type&lt;BR&gt;&amp;nbsp;----------------------------------------- -------- ------------&lt;/P&gt;&lt;P&gt;&amp;nbsp;EMPLOYEE_ID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NOT NULL NUMBER(6)&lt;BR&gt;&amp;nbsp;FIRST_NAME&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VARCHAR2(20)&lt;BR&gt;&amp;nbsp;LAST_NAME&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NOT NULL VARCHAR2(25)&lt;BR&gt;&amp;nbsp;EMAIL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NOT NULL VARCHAR2(25)&lt;BR&gt;&amp;nbsp;PHONE_NUMBER&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VARCHAR2(20)&lt;BR&gt;&amp;nbsp;HIRE_DATE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NOT NULL DATE&lt;BR&gt;&amp;nbsp;JOB_ID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NOT NULL VARCHAR2(10)&lt;BR&gt;&amp;nbsp;SALARY&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NUMBER(8,2)&lt;BR&gt;&amp;nbsp;COMMISSION_PCT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NUMBER(2,2)&lt;BR&gt;&amp;nbsp;MANAGER_ID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NUMBER(6)&lt;BR&gt;&amp;nbsp;DEPARTMENT_ID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NUMBER(4)&lt;BR&gt;Now, I'll create the trigger on employees. The trigger will only fire on insert or update (not delete), update will only fire when email or hire_date is modified and the trigger body will only fire when the :old.salary is greater than 7500. Because it will only fire when an :old value is set, it will never fire for an insert, even though I am defining it for insert.&lt;/P&gt;&lt;P&gt;SQL&amp;gt; create or replace trigger emp_email&lt;BR&gt;&amp;nbsp; 2&amp;nbsp; before insert or update of email, hire_date&lt;BR&gt;&amp;nbsp; 3&amp;nbsp; on employees&lt;BR&gt;&amp;nbsp; 4&amp;nbsp; for each row when (old.salary &amp;gt; 7500)&lt;BR&gt;&amp;nbsp; 5&amp;nbsp; begin&lt;BR&gt;&amp;nbsp; 6&amp;nbsp;&amp;nbsp;&amp;nbsp; dbms_output.put_line('Trigger executing');&lt;BR&gt;&amp;nbsp; 7&amp;nbsp; end;&lt;BR&gt;&amp;nbsp; 8&amp;nbsp; /&lt;/P&gt;&lt;P&gt;&amp;nbsp; Trigger created.&lt;BR&gt;Next, I'll fire two inserts to add a couple of records. Only one of the records will have a salary &amp;gt; 7500. After the inserts, I will update each record. Only the record with a salary &amp;gt; 7500 will display the trigger message.&lt;/P&gt;&lt;P&gt;&amp;nbsp; SQL&amp;gt; set serveroutput on&lt;/P&gt;&lt;P&gt;&amp;nbsp; SQL&amp;gt; insert into employees&lt;BR&gt;&amp;nbsp; 2&amp;nbsp; (employee_id, last_name, email,&lt;BR&gt;&amp;nbsp; 3&amp;nbsp;&amp;nbsp; hire_date, job_id, salary)&lt;BR&gt;&amp;nbsp; 4&amp;nbsp; values&lt;BR&gt;&amp;nbsp; 5&amp;nbsp; (101010, 'Smith', 'smith@barney.com',&lt;BR&gt;&amp;nbsp; 6&amp;nbsp;&amp;nbsp; sysdate, 'PR_REP', 5000);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; 1 row created.&lt;/P&gt;&lt;P&gt;&amp;nbsp; SQL&amp;gt; insert into employees&lt;BR&gt;&amp;nbsp; 2 (employee_id, last_name, email,&lt;BR&gt;&amp;nbsp;&amp;nbsp; 3 hire_date, job_id, salary)&lt;BR&gt;&amp;nbsp;&amp;nbsp; 4 values&lt;BR&gt;&amp;nbsp;&amp;nbsp; 5 (101011, 'Jones', 'jones@barney.com',&lt;BR&gt;&amp;nbsp;&amp;nbsp; 6 sysdate, 'PR_REP', 8000);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; 1 row created.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; SQL&amp;gt; commit;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; Commit complete.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; SQL&amp;gt; update employees set&lt;BR&gt;&amp;nbsp;&amp;nbsp; 2 email = 'under7500@noexec.com'&lt;BR&gt;&amp;nbsp;&amp;nbsp; 3 where employee_id = 101010;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; 1 row updated.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; SQL&amp;gt; update employees set&lt;BR&gt;&amp;nbsp;&amp;nbsp; 2 email = 'over7500@willexec.com'&lt;BR&gt;&amp;nbsp;&amp;nbsp; 3 where employee_id = 101011;&lt;BR&gt;&amp;nbsp;&amp;nbsp; Trigger executing&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; 1 row updated.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; SQL&amp;gt; commit;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; Commit complete.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; SQL&amp;gt;&lt;/P&gt;&lt;P&gt;That's pretty much it for DML triggers.&lt;/P&gt;&lt;P&gt;From it.toolbox.com by LewisC&lt;/P&gt;&lt;br/&gt;Blog Posted on: &lt;b&gt;Friday, February 27, 2009 at 08:31-AM&lt;/b&gt;</description>
      <author>Rajiv Sharma</author>
      <pubDate>Fri, 27 Feb 2009 08:31:21 GMT</pubDate>
      <subject>Friday, February 27, 2009 at 08:31-AM</subject>
    </item>
    <item>
      <title>Oracle/PLSQL: BEFORE INSERT Trigger</title>
      <link>/blog/10/sql-serever-oracle-plsql/120/oracleplsql-before-insert-trigger.aspx</link>
      <description>&lt;P&gt;A BEFORE INSERT Trigger means that Oracle will fire this trigger before the INSERT operation is executed.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;The syntax for an BEFORE INSERT Trigger is:&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;CREATE or REPLACE TRIGGER trigger_name&lt;BR&gt;BEFORE INSERT&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ON table_name&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ FOR EACH ROW ]&lt;BR&gt;DECLARE&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- variable declarations&lt;BR&gt;BEGIN&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- trigger code&lt;BR&gt;EXCEPTION&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHEN ...&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- exception handling&lt;BR&gt;END;&lt;/P&gt;&lt;P&gt;trigger_name is the name of the trigger to create.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Restrictions:&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;You can not create a BEFORE trigger on a view. &lt;BR&gt;You can update the :NEW values. &lt;BR&gt;You can not update the :OLD values. &lt;BR&gt;For example:&lt;/P&gt;&lt;P&gt;If you had a table created as follows:&lt;/P&gt;&lt;P&gt;CREATE TABLE orders &lt;BR&gt;( order_id number(5), &lt;BR&gt;&amp;nbsp;quantity number(4), &lt;BR&gt;&amp;nbsp;cost_per_item number(6,2), &lt;BR&gt;&amp;nbsp;total_cost number(8,2), &lt;BR&gt;&amp;nbsp;create_date date, &lt;BR&gt;&amp;nbsp;created_by varchar2(10) &lt;BR&gt;); &lt;/P&gt;&lt;P&gt;We could then create a BEFORE INSERT trigger as follows:&lt;/P&gt;&lt;P&gt;CREATE OR REPLACE TRIGGER orders_before_insert&lt;BR&gt;BEFORE INSERT&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ON orders&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FOR EACH ROW&lt;/P&gt;&lt;P&gt;DECLARE&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; v_username varchar2(10);&lt;/P&gt;&lt;P&gt;BEGIN&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Find username of person performing INSERT into table&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT user INTO v_username&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM dual;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Update create_date field to current system date&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; :new.create_date := sysdate;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Update created_by field to the username of the person performing the INSERT&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; :new.created_by := v_username;&lt;/P&gt;&lt;P&gt;END;&lt;BR&gt;&lt;BR&gt;From www.techonthenet.com&lt;/P&gt;&lt;br/&gt;Blog Posted on: &lt;b&gt;Friday, February 27, 2009 at 08:31-AM&lt;/b&gt;</description>
      <author>Rajiv Sharma</author>
      <pubDate>Fri, 27 Feb 2009 08:31:21 GMT</pubDate>
      <subject>Friday, February 27, 2009 at 08:31-AM</subject>
    </item>
    <item>
      <title>Oracle/PLSQL: AFTER INSERT Trigger</title>
      <link>/blog/10/sql-serever-oracle-plsql/121/oracleplsql-after-insert-trigger.aspx</link>
      <description>&lt;P&gt;An AFTER INSERT Trigger means that Oracle will fire this trigger after the INSERT operation is executed.&lt;/P&gt;&lt;P&gt;The syntax for an AFTER INSERT Trigger is:&lt;/P&gt;&lt;P&gt;CREATE or REPLACE TRIGGER trigger_name&lt;BR&gt;AFTER INSERT&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ON table_name&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ FOR EACH ROW ]&lt;BR&gt;DECLARE&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- variable declarations&lt;BR&gt;BEGIN&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- trigger code&lt;BR&gt;EXCEPTION&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHEN ...&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- exception handling&lt;BR&gt;END;&lt;/P&gt;&lt;P&gt;trigger_name is the name of the trigger to create.&lt;/P&gt;&lt;P&gt;Restrictions:&lt;/P&gt;&lt;P&gt;You can not create an AFTER trigger on a view. &lt;BR&gt;You can not update the :NEW values. &lt;BR&gt;You can not update the :OLD values. &lt;BR&gt;For example:&lt;/P&gt;&lt;P&gt;If you had a table created as follows:&lt;/P&gt;&lt;P&gt;CREATE TABLE orders &lt;BR&gt;( order_id number(5), &lt;BR&gt;&amp;nbsp;quantity number(4), &lt;BR&gt;&amp;nbsp;cost_per_item number(6,2), &lt;BR&gt;&amp;nbsp;total_cost number(8,2) &lt;BR&gt;); &lt;/P&gt;&lt;P&gt;We could then create an AFTER INSERT trigger as follows:&lt;/P&gt;&lt;P&gt;CREATE OR REPLACE TRIGGER orders_after_insert&lt;BR&gt;AFTER INSERT&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ON orders&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FOR EACH ROW&lt;/P&gt;&lt;P&gt;DECLARE&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; v_username varchar2(10);&lt;/P&gt;&lt;P&gt;BEGIN&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Find username of person performing the INSERT into the table&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT user INTO v_username&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM dual;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Insert record into audit table&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; INSERT INTO orders_audit&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( order_id,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; quantity,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cost_per_item,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; total_cost,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; username )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; VALUES&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( :new.order_id,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :new.quantity,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :new.cost_per_item,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :new.total_cost,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; v_username );&lt;/P&gt;&lt;P&gt;END;&lt;/P&gt;&lt;P&gt;From www.techonthenet.com&lt;/P&gt;&lt;br/&gt;Blog Posted on: &lt;b&gt;Friday, February 27, 2009 at 08:31-AM&lt;/b&gt;</description>
      <author>Rajiv Sharma</author>
      <pubDate>Fri, 27 Feb 2009 08:31:21 GMT</pubDate>
      <subject>Friday, February 27, 2009 at 08:31-AM</subject>
    </item>
    <item>
      <title>Oracle/PLSQL: BEFORE UPDATE Trigger</title>
      <link>/blog/10/sql-serever-oracle-plsql/122/oracleplsql-before-update-trigger.aspx</link>
      <description>&lt;P&gt;A BEFORE UPDATE Trigger means that Oracle will fire this trigger before the UPDATE operation is executed.&lt;/P&gt;&lt;P&gt;The syntax for an BEFORE UPDATE Trigger is:&lt;/P&gt;&lt;P&gt;CREATE or REPLACE TRIGGER trigger_name&lt;BR&gt;BEFORE UPDATE&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ON table_name&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ FOR EACH ROW ]&lt;BR&gt;DECLARE&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- variable declarations&lt;BR&gt;BEGIN&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- trigger code&lt;BR&gt;EXCEPTION&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHEN ...&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- exception handling&lt;BR&gt;END;&lt;/P&gt;&lt;P&gt;trigger_name is the name of the trigger to create.&lt;/P&gt;&lt;P&gt;Restrictions:&lt;/P&gt;&lt;P&gt;You can not create a BEFORE trigger on a view. &lt;BR&gt;You can update the :NEW values. &lt;BR&gt;You can not update the :OLD values. &lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;For example:&lt;/P&gt;&lt;P&gt;If you had a table created as follows:&lt;/P&gt;&lt;P&gt;CREATE TABLE orders &lt;BR&gt;( order_id number(5), &lt;BR&gt;&amp;nbsp;quantity number(4), &lt;BR&gt;&amp;nbsp;cost_per_item number(6,2), &lt;BR&gt;&amp;nbsp;total_cost number(8,2), &lt;BR&gt;&amp;nbsp;updated_date date, &lt;BR&gt;&amp;nbsp;updated_by varchar2(10) &lt;BR&gt;); &lt;/P&gt;&lt;P&gt;&lt;BR&gt;We could then create a BEFORE UPDATE trigger as follows:&lt;/P&gt;&lt;P&gt;CREATE OR REPLACE TRIGGER orders_before_update&lt;BR&gt;BEFORE UPDATE&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ON orders&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FOR EACH ROW&lt;/P&gt;&lt;P&gt;DECLARE&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; v_username varchar2(10);&lt;/P&gt;&lt;P&gt;BEGIN&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Find username of person performing UPDATE on the table&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT user INTO v_username&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM dual;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Update updated_date field to current system date&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; :new.updated_date := sysdate;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Update updated_by field to the username of the person performing the UPDATE&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; :new.updated_by := v_username;&lt;/P&gt;&lt;P&gt;END;&lt;/P&gt;&lt;P&gt;From www.techonthenet.com&lt;/P&gt;&lt;br/&gt;Blog Posted on: &lt;b&gt;Friday, February 27, 2009 at 08:31-AM&lt;/b&gt;</description>
      <author>Rajiv Sharma</author>
      <pubDate>Fri, 27 Feb 2009 08:31:21 GMT</pubDate>
      <subject>Friday, February 27, 2009 at 08:31-AM</subject>
    </item>
    <item>
      <title>Oracle/PLSQL: AFTER UPDATE Trigger</title>
      <link>/blog/10/sql-serever-oracle-plsql/123/oracleplsql-after-update-trigger.aspx</link>
      <description>&lt;P&gt;An AFTER UPDATE Trigger means that Oracle will fire this trigger after the UPDATE operation is executed.&lt;/P&gt;&lt;P&gt;The syntax for an AFTER UPDATE Trigger is:&lt;/P&gt;&lt;P&gt;CREATE or REPLACE TRIGGER trigger_name&lt;BR&gt;AFTER UPDATE&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ON table_name&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ FOR EACH ROW ]&lt;BR&gt;DECLARE&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- variable declarations&lt;BR&gt;BEGIN&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- trigger code&lt;BR&gt;EXCEPTION&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHEN ...&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- exception handling&lt;BR&gt;END;&lt;/P&gt;&lt;P&gt;trigger_name is the name of the trigger to create.&lt;/P&gt;&lt;P&gt;Restrictions:&lt;/P&gt;&lt;P&gt;You can not create an AFTER trigger on a view. &lt;BR&gt;You can not update the :NEW values. &lt;BR&gt;You can not update the :OLD values. &lt;BR&gt;For example:&lt;/P&gt;&lt;P&gt;If you had a table created as follows:&lt;/P&gt;&lt;P&gt;CREATE TABLE orders &lt;BR&gt;( order_id number(5), &lt;BR&gt;&amp;nbsp;quantity number(4), &lt;BR&gt;&amp;nbsp;cost_per_item number(6,2), &lt;BR&gt;&amp;nbsp;total_cost number(8,2) &lt;BR&gt;); &lt;/P&gt;&lt;P&gt;&lt;BR&gt;We could then create an AFTER UPDATE trigger as follows:&lt;/P&gt;&lt;P&gt;CREATE OR REPLACE TRIGGER orders_after_update&lt;BR&gt;AFTER UPDATE&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ON orders&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FOR EACH ROW&lt;/P&gt;&lt;P&gt;DECLARE&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; v_username varchar2(10);&lt;/P&gt;&lt;P&gt;BEGIN&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Find username of person performing UPDATE into table&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT user INTO v_username&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM dual;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Insert record into audit table&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; INSERT INTO orders_audit&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( order_id,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; quantity_before,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; quantity_after,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; username )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; VALUES&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( :new.order_id,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :old.quantity,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :new.quantity,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; v_username );&lt;/P&gt;&lt;P&gt;END;&amp;nbsp;&lt;/P&gt;&lt;P&gt;From www.techonthenet.com&lt;/P&gt;&lt;br/&gt;Blog Posted on: &lt;b&gt;Friday, February 27, 2009 at 08:31-AM&lt;/b&gt;</description>
      <author>Rajiv Sharma</author>
      <pubDate>Fri, 27 Feb 2009 08:31:21 GMT</pubDate>
      <subject>Friday, February 27, 2009 at 08:31-AM</subject>
    </item>
    <item>
      <title>Oracle/PLSQL: BEFORE DELETE Trigger</title>
      <link>/blog/10/sql-serever-oracle-plsql/124/oracleplsql-before-delete-trigger.aspx</link>
      <description>&lt;P&gt;A BEFORE DELETE Trigger means that Oracle will fire this trigger before the DELETE operation is executed.&lt;/P&gt;&lt;P&gt;The syntax for an BEFORE DELETE Trigger is:&lt;/P&gt;&lt;P&gt;CREATE or REPLACE TRIGGER trigger_name&lt;BR&gt;BEFORE DELETE&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ON table_name&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ FOR EACH ROW ]&lt;BR&gt;DECLARE&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- variable declarations&lt;BR&gt;BEGIN&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- trigger code&lt;BR&gt;EXCEPTION&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHEN ...&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- exception handling&lt;BR&gt;END;&lt;/P&gt;&lt;P&gt;trigger_name is the name of the trigger to create.&lt;/P&gt;&lt;P&gt;Restrictions:&lt;/P&gt;&lt;P&gt;You can not create a BEFORE trigger on a view. &lt;BR&gt;You can update the :NEW values. &lt;BR&gt;You can not update the :OLD values. &lt;BR&gt;For example:&lt;/P&gt;&lt;P&gt;If you had a table created as follows:&lt;/P&gt;&lt;P&gt;CREATE TABLE orders &lt;BR&gt;( order_id number(5), &lt;BR&gt;&amp;nbsp;quantity number(4), &lt;BR&gt;&amp;nbsp;cost_per_item number(6,2), &lt;BR&gt;&amp;nbsp;total_cost number(8,2) &lt;BR&gt;); &lt;/P&gt;&lt;P&gt;We could then create a BEFORE DELETE trigger as follows:&lt;/P&gt;&lt;P&gt;CREATE OR REPLACE TRIGGER orders_before_delete&lt;BR&gt;BEFORE DELETE&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ON orders&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FOR EACH ROW&lt;/P&gt;&lt;P&gt;DECLARE&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; v_username varchar2(10);&lt;/P&gt;&lt;P&gt;BEGIN&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Find username of person performing the DELETE on the table&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT user INTO v_username&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM dual;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Insert record into audit table&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; INSERT INTO orders_audit&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( order_id,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; quantity,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cost_per_item,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; total_cost,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delete_date,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; deleted_by )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; VALUES&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( :old.order_id,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :old.quantity,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :old.cost_per_item,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :old.total_cost,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sysdate,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; v_username );&lt;/P&gt;&lt;P&gt;END;&amp;nbsp;&lt;/P&gt;&lt;P&gt;From www.techonthenet.com&lt;/P&gt;&lt;br/&gt;Blog Posted on: &lt;b&gt;Friday, February 27, 2009 at 08:31-AM&lt;/b&gt;</description>
      <author>Rajiv Sharma</author>
      <pubDate>Fri, 27 Feb 2009 08:31:21 GMT</pubDate>
      <subject>Friday, February 27, 2009 at 08:31-AM</subject>
    </item>
    <item>
      <title>Oracle/PLSQL: AFTER DELETE Trigger</title>
      <link>/blog/10/sql-serever-oracle-plsql/125/oracleplsql-after-delete-trigger.aspx</link>
      <description>&lt;P&gt;An AFTER DELETE Trigger means that Oracle will fire this trigger after the DELETE operation is executed.&lt;/P&gt;&lt;P&gt;The syntax for an AFTER DELETE Trigger is:&lt;/P&gt;&lt;P&gt;CREATE or REPLACE TRIGGER trigger_name&lt;BR&gt;AFTER DELETE&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ON table_name&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ FOR EACH ROW ]&lt;BR&gt;DECLARE&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- variable declarations&lt;BR&gt;BEGIN&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- trigger code&lt;BR&gt;EXCEPTION&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHEN ...&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- exception handling&lt;BR&gt;END;&lt;/P&gt;&lt;P&gt;trigger_name is the name of the trigger to create.&lt;/P&gt;&lt;P&gt;Restrictions:&lt;/P&gt;&lt;P&gt;You can not create an AFTER trigger on a view. &lt;BR&gt;You can not update the :NEW values. &lt;BR&gt;You can not update the :OLD values. &lt;BR&gt;For example:&lt;/P&gt;&lt;P&gt;If you had a table created as follows:&lt;/P&gt;&lt;P&gt;CREATE TABLE orders &lt;BR&gt;( order_id number(5), &lt;BR&gt;&amp;nbsp;quantity number(4), &lt;BR&gt;&amp;nbsp;cost_per_item number(6,2), &lt;BR&gt;&amp;nbsp;total_cost number(8,2) &lt;BR&gt;); &lt;/P&gt;&lt;P&gt;&lt;BR&gt;We could then create an DELETE UPDATE trigger as follows:&lt;/P&gt;&lt;P&gt;CREATE OR REPLACE TRIGGER orders_after_delete&lt;BR&gt;AFTER DELETE&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ON orders&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FOR EACH ROW&lt;/P&gt;&lt;P&gt;DECLARE&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; v_username varchar2(10);&lt;/P&gt;&lt;P&gt;BEGIN&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Find username of person performing the DELETE on the table&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT user INTO v_username&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM dual;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Insert record into audit table&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; INSERT INTO orders_audit&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( order_id,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; quantity,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cost_per_item,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; total_cost,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delete_date,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; deleted_by)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; VALUES&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( :old.order_id,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :old.quantity,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :old.cost_per_item,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :old.total_cost,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sysdate,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; v_username );&lt;/P&gt;&lt;P&gt;END;&amp;nbsp;&lt;/P&gt;&lt;P&gt;From www.techonthenet.com&lt;/P&gt;&lt;br/&gt;Blog Posted on: &lt;b&gt;Friday, February 27, 2009 at 08:31-AM&lt;/b&gt;</description>
      <author>Rajiv Sharma</author>
      <pubDate>Fri, 27 Feb 2009 08:31:21 GMT</pubDate>
      <subject>Friday, February 27, 2009 at 08:31-AM</subject>
    </item>
    <item>
      <title>Oracle/PLSQL: Drop a Trigger</title>
      <link>/blog/10/sql-serever-oracle-plsql/126/oracleplsql-drop-a-trigger.aspx</link>
      <description>&lt;P&gt;The syntax for a dropping a Trigger is:&lt;/P&gt;&lt;P&gt;DROP TRIGGER trigger_name;&lt;/P&gt;&lt;P&gt;For example:&lt;/P&gt;&lt;P&gt;If you had a trigger called orders_before_insert, you could drop it with the following command:&lt;/P&gt;&lt;P&gt;DROP TRIGGER orders_before_insert;&amp;nbsp;&lt;/P&gt;&lt;P&gt;From www.techonthenet.com&lt;/P&gt;&lt;br/&gt;Blog Posted on: &lt;b&gt;Friday, February 27, 2009 at 08:31-AM&lt;/b&gt;</description>
      <author>Rajiv Sharma</author>
      <pubDate>Fri, 27 Feb 2009 08:31:21 GMT</pubDate>
      <subject>Friday, February 27, 2009 at 08:31-AM</subject>
    </item>
  </channel>
</rss>