<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>OraNA :: APEX</title><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/orana_apex" /><language>en</language><managingEditor>noemail@noemail.org (OraNA.info)</managingEditor><lastBuildDate>Fri, 12 Mar 2010 01:04:00 PST</lastBuildDate><generator>Google Reader http://www.google.com/reader</generator><gr:continuation xmlns:gr="http://www.google.com/schemas/reader/atom/">CM7n1YX9kKAC</gr:continuation><feedburner:info uri="orana_apex" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><description>Read and monitor Oracle APEX related blogs and news sources, all in one place.</description><item><title>Word count in Pages (OSX)</title><link>http://feedproxy.google.com/~r/orana_apex/~3/GNPRM8SFCZI/word-count-in-pages-osx.html</link><category>pages</category><category>osx</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dimitri Gielis</dc:creator><pubDate>Fri, 12 Mar 2010 01:03:51 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/626608e6a460da99</guid><description>Sometimes it's hard to find something if you don't use it that much.&lt;br&gt;&lt;br&gt;&lt;a href="http://4.bp.blogspot.com/_tffIKLFlRlY/S5oCEjaFltI/AAAAAAAAFlM/vzW23L-sXhk/s1600-h/Screen+shot+2010-03-12+at+09.56.57.png"&gt;&lt;img style="float:right;margin:0pt 0pt 10px 10px;width:50px;height:42px" src="http://4.bp.blogspot.com/_tffIKLFlRlY/S5oCEjaFltI/AAAAAAAAFlM/vzW23L-sXhk/s400/Screen+shot+2010-03-12+at+09.56.57.png" alt="" border="0"&gt;&lt;/a&gt;I was searching for a Word and Character count in Pages (OSX). Pages is like Word, but than from Apple. Anyway, in Pages most nice "things" are under the Inspector icon.&lt;br&gt;&lt;br&gt;The first icon (Document) and the third tab in there, give you what you need. Information about your document, like the number of words you used, number of characters etc.&lt;br&gt;&lt;br&gt;&lt;a href="http://1.bp.blogspot.com/_tffIKLFlRlY/S5oC0fM723I/AAAAAAAAFlc/Lvaw7mUZwAE/s1600-h/Screen+shot+2010-03-12+at+10.00.19.png"&gt;&lt;img style="display:block;margin:0px auto 10px;text-align:center;width:156px;height:400px" src="http://1.bp.blogspot.com/_tffIKLFlRlY/S5oC0fM723I/AAAAAAAAFlc/Lvaw7mUZwAE/s400/Screen+shot+2010-03-12+at+10.00.19.png" alt="" border="0"&gt;&lt;/a&gt;&lt;br&gt;The better you know something, the faster you can get what you want, it applies to everything ...&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/21122514-9109153771175150626?l=dgielis.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/orana_apex/~4/GNPRM8SFCZI" height="1" width="1"/&gt;</description><feedburner:origLink>http://dgielis.blogspot.com/2010/03/word-count-in-pages-osx.html</feedburner:origLink></item><item><title>Automatic linebreak if word breaks out of table element</title><link>http://feedproxy.google.com/~r/orana_apex/~3/y9eVxQFHmXQ/automatic-linebreak-if-word-breaks-out.html</link><category>IE issues</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Tobias Arnhold</dc:creator><pubDate>Thu, 11 Mar 2010 13:36:56 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/d0029ed4638e9e4c</guid><description>I found a great source how to prevent word break outs in &amp;lt;th&amp;gt; and &amp;lt;td&amp;gt; elements:&lt;br&gt;&lt;a href="http://petesbloggerama.blogspot.com/2007/02/firefox-ie-word-wrap-word-break-tables.html"&gt;Peter Bromberg's: FIREFOX / IE Word-Wrap, Word-Break, TABLES FIX &lt;/a&gt;&lt;br&gt;How does the break out looks like:&lt;br&gt;&lt;a href="http://1.bp.blogspot.com/_A7ko33pi4F4/S5liXBJBesI/AAAAAAAAAQQ/4Hu0lgRgYeo/s1600-h/break_out_issue.png"&gt;&lt;img style="display:block;margin:0px auto 10px;text-align:center;width:329px;height:144px" src="http://1.bp.blogspot.com/_A7ko33pi4F4/S5liXBJBesI/AAAAAAAAAQQ/4Hu0lgRgYeo/s400/break_out_issue.png" border="0" alt=""&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;CSS code to prevent this issue:&lt;br&gt;&lt;pre name="code"&gt;&lt;br&gt;.prevent_breakout&lt;br&gt;{&lt;br&gt;width: 250px;&lt;br&gt;white-space: pre-wrap; /* css-3 */&lt;br&gt;white-space: -moz-pre-wrap; /* Mozilla, since 1999 */&lt;br&gt;white-space: -pre-wrap; /* Opera 4-6 */&lt;br&gt;white-space: -o-pre-wrap; /* Opera 7 */&lt;br&gt;word-wrap: break-word; /* Internet Explorer 5.5+ */&lt;br&gt;}&lt;br&gt;&lt;/pre&gt;&lt;br&gt;With javascript it could look like this:&lt;br&gt;&lt;pre name="code"&gt;&lt;br&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br&gt; function set_lb(v_val, v_max_width){&lt;br&gt;  var v_browser=navigator.appName; &lt;br&gt;  // ...&lt;br&gt;  if (v_browser=="Microsoft Internet Explorer")  &lt;br&gt;  {&lt;br&gt;    $x(v_val).style.width = v_max_width; // set width&lt;br&gt;    $x(v_val).style.wordWrap   = 'break-word';  // Internet Explorer 5.5+&lt;br&gt;  }else&lt;br&gt;  {&lt;br&gt;    $x(v_val).style.width = v_max_width; // set width&lt;br&gt;    $x(v_val).style.whiteSpace = 'pre-wrap'; // css-3&lt;br&gt;    $x(v_val).style.whiteSpace = '-pre-wrap';  // Opera 4-6&lt;br&gt;    $x(v_val).style.whiteSpace = '-o-pre-wrap';  // Opera 7&lt;br&gt;    $x(v_val).style.wordWrap   = 'break-word';  // Internet Explorer 5.5+&lt;br&gt;    $x(v_val).style.whiteSpace = '-moz-pre-wrap'; // Mozilla, since 1999&lt;br&gt;  }&lt;br&gt;&amp;lt;/script&amp;gt;&lt;br&gt;&lt;/pre&gt;&lt;br&gt;Thanks Peter for this great hint!&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/6481483192141562388-8098211799162554244?l=apex-at-work.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/orana_apex/~4/y9eVxQFHmXQ" height="1" width="1"/&gt;</description><feedburner:origLink>http://apex-at-work.blogspot.com/2010/03/automatic-linebreak-if-word-breaks-out.html</feedburner:origLink></item><item><title>Tabular Form - Preserve Changes</title><link>http://feedproxy.google.com/~r/orana_apex/~3/ntUR2myH9IQ/tabular-form-preserve-changes.html</link><category>o</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Denes Kubicek</dc:creator><pubDate>Thu, 11 Mar 2010 07:58:02 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/9c019cbacffaca08</guid><description>In our last training (08.03-10.03.2010) there was an interesting question on how to preserve the changes made in a tabular form while paginating through it. The requirement was also to save all the changes made independant of the visible set of rows. This problem can be solved using apex collections. &lt;a href="http://apex.oracle.com/pls/otn/f?p=31517:246"&gt;This&lt;/a&gt; page in my &lt;a href="http://apex.oracle.com/pls/otn/f?p=31517:246"&gt;Demo Application&lt;/a&gt; holds a working example including the full description of the code.&lt;br&gt;&lt;br&gt;&lt;a href="http://4.bp.blogspot.com/_y49oG7ohpQE/S5kDNNosyhI/AAAAAAAAAUw/MGLbr3KBLFE/s1600-h/shuttle.jpg"&gt;&lt;img style="display:block;margin:0px auto 10px;text-align:center;width:143px;height:107px" src="http://4.bp.blogspot.com/_y49oG7ohpQE/S5kDNNosyhI/AAAAAAAAAUw/MGLbr3KBLFE/s320/shuttle.jpg" border="0" alt=""&gt;&lt;/a&gt;&lt;br&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1561253375800464394-4588092071573370782?l=deneskubicek.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/orana_apex/~4/ntUR2myH9IQ" height="1" width="1"/&gt;</description><feedburner:origLink>http://deneskubicek.blogspot.com/2010/03/tabular-form-preserve-changes.html</feedburner:origLink></item><item><title>Things you have in common with Larry</title><link>http://feedproxy.google.com/~r/orana_apex/~3/YJ-9UhcMROM/things-you-have-in-common-with-larry.html</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">david.peake@oracle.com (David Peake)</dc:creator><pubDate>Tue, 09 Mar 2010 08:17:00 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/b8d491338ef2c06e</guid><description>&lt;a href="http://2.bp.blogspot.com/_qi17UN8gfwg/S5gRe1n4IrI/AAAAAAAAAIo/eDr-UjBR1b8/s1600-h/bor90.gif"&gt;&lt;img style="display:block;margin:0px auto 10px;text-align:center;width:300px;height:200px" src="http://2.bp.blogspot.com/_qi17UN8gfwg/S5gRe1n4IrI/AAAAAAAAAIo/eDr-UjBR1b8/s400/bor90.gif" border="0" alt=""&gt;&lt;/a&gt;&lt;br&gt;Larry and I have something in common -- We both like sailing!&lt;br&gt;I prefer catamarans to trimarans, but hey all those design experts were proven right - the BMW ORACLE Racing Trimaran [BOR90]is arguably the fastest sailing boat ever built. I did a lot of sailing back in Australia where I owned a small cat. In fact a good mate of mine Kevin Crowley of &lt;a href="http://www.pacificdbms.com.au/"&gt;Pacific DBMS&lt;/a&gt; (free plug least I could do ... and they offer APEX Consulting services as well) still has it in his back yard.&lt;br&gt;&lt;br&gt;Now something else Larry and I have in common - We both like Application Express.&lt;br&gt;Larry has been a big supporter of Application Express since the beginning.&lt;br&gt;Sergio Leunissen, former APEX PM and now in the Linux group, developed an APEX application for the BMW ORACLE Racing team when they first started out years ago.&lt;br&gt;Again with the 33rd America's Cup challenge the team used APEX together with Data Mining to support the team.&lt;br&gt;&lt;br&gt;Listen to this podcast from Ian "Fresh" Burns, design coordinator for the team on how Oracle technology helped the team to win the America's Cup: &lt;a href="http://feedproxy.google.com/~r/OracleDatabaseInsider/~5/nussC-gxZFQ/8576609_Ian_Burns_030810.mp3"&gt;http://feedproxy.google.com/~r/OracleDatabaseInsider/~5/nussC-gxZFQ/8576609_Ian_Burns_030810.mp3&lt;/a&gt;&lt;br&gt;&lt;br&gt;Cheers,&lt;br&gt;David&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1492486987665573895-8694066081996066356?l=dpeake.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/orana_apex/~4/YJ-9UhcMROM" height="1" width="1"/&gt;</description><feedburner:origLink>http://feedproxy.google.com/~r/dpeake/~3/VxVWgirRnC0/things-you-have-in-common-with-larry.html</feedburner:origLink></item><item><title>Weird IE behaviour with JS function String.charAt(Index)</title><link>http://feedproxy.google.com/~r/orana_apex/~3/32KG_2sE89M/weird-ie-behaviour-with-js-function.html</link><category>APEX issues</category><category>IE issues</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Tobias Arnhold</dc:creator><pubDate>Wed, 10 Mar 2010 13:33:18 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/19abd4e14cb2053d</guid><description>I had a real pain with the MS Internet Explorer and the javascript function &lt;a href="http://www.hunlock.com/blogs/The_Complete_Javascript_Strings_Reference"&gt;String.charAt(Index)&lt;/a&gt;&lt;br&gt;&lt;br&gt;I wanted to update a string and checked each value. IE was able to give just an empty value back. But it was not checkable!&lt;br&gt;&lt;br&gt;&lt;span style="font-style:italic"&gt;if ((v_browser==&amp;quot;Microsoft Internet Explorer&amp;quot;)&amp;amp;&amp;amp; (v_string.charAt(x)==&amp;#39;&amp;#39;)&amp;amp;&amp;amp; (y+1==x) &amp;amp;&amp;amp; (v_string.charAt(x+1)==&amp;#39;&amp;lt;&amp;#39;||v_string.charAt(x+2)==&amp;#39;&amp;lt;&amp;#39;))&lt;/span&gt;&lt;br&gt;&lt;br&gt;Even the length was 1 and not 0!&lt;br&gt;Finally I tried this function &lt;span style="font-weight:bold"&gt;String.charCodeAt(Index)&lt;/span&gt; with an alert box and voilà two values where prompted: 13 and 10&lt;br&gt;&lt;br&gt;13 and 10 wait... LINEBREAK!&lt;br&gt;&lt;br&gt;HELL why does it do such things...&lt;br&gt;&lt;br&gt;Now I could check it!&lt;br&gt;&lt;br&gt;&lt;span style="font-style:italic"&gt;if ((v_browser==&amp;quot;Microsoft Internet Explorer&amp;quot;)&amp;amp;&amp;amp;(v_check_unicode==&amp;#39;13&amp;#39;||v_check_unicode==&amp;#39;10&amp;#39;||v_check_unicode==&amp;#39;NaN&amp;#39;))  &lt;/span&gt; &lt;br&gt;&lt;br&gt;My script works and I feel released.&lt;br&gt;Now I have to watch the end of Real against Lyon.. :D&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/6481483192141562388-3398808537491805124?l=apex-at-work.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/orana_apex/~4/32KG_2sE89M" height="1" width="1"/&gt;</description><feedburner:origLink>http://apex-at-work.blogspot.com/2010/03/weird-ie-behaviour-with-js-function.html</feedburner:origLink></item><item><title>Column header groups in APEX report</title><link>http://feedproxy.google.com/~r/orana_apex/~3/opT6nZy_7-w/column-header-groups-in-apex-report.html</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Tobias Arnhold</dc:creator><pubDate>Wed, 10 Mar 2010 11:30:55 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/8d0f8bd0c37f4a1d</guid><description>Did you ever want a report header grouped like this:&lt;br&gt;&lt;a href="http://3.bp.blogspot.com/_A7ko33pi4F4/S5fvvCrBbxI/AAAAAAAAAP4/oz4XyxENid4/s1600-h/report_header_groups.png"&gt;&lt;img style="display:block;margin:0px auto 10px;text-align:center;width:400px;height:146px" src="http://3.bp.blogspot.com/_A7ko33pi4F4/S5fvvCrBbxI/AAAAAAAAAP4/oz4XyxENid4/s400/report_header_groups.png" border="0" alt=""&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;Just add some html code into your report template &amp;gt; column headings &amp;gt; Before Column Heading:&lt;br&gt;&lt;a href="http://4.bp.blogspot.com/_A7ko33pi4F4/S5fwJwSn3JI/AAAAAAAAAQA/O0RtpMSqkfE/s1600-h/report_header_settings.png"&gt;&lt;img style="display:block;margin:0px auto 10px;text-align:center;width:400px;height:181px" src="http://4.bp.blogspot.com/_A7ko33pi4F4/S5fwJwSn3JI/AAAAAAAAAQA/O0RtpMSqkfE/s400/report_header_settings.png" border="0" alt=""&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;Important to know:&lt;br&gt; - Changes like this have effect on every report you use with that report template&lt;br&gt; - Make a copy of your existing report template and use the new one instead &lt;br&gt;&lt;br&gt;In my example I used 8 columns and three of them should have a group column above it. Use colspan="3" to stripe it over 3 columns.&lt;br&gt;&lt;br&gt;Here the generated HTML code:&lt;br&gt;&lt;a href="http://1.bp.blogspot.com/_A7ko33pi4F4/S5fyWXQiFNI/AAAAAAAAAQI/fYYR7aLI8xA/s1600-h/report_header_html.png"&gt;&lt;img style="display:block;margin:0px auto 10px;text-align:center;width:400px;height:209px" src="http://1.bp.blogspot.com/_A7ko33pi4F4/S5fyWXQiFNI/AAAAAAAAAQI/fYYR7aLI8xA/s400/report_header_html.png" border="0" alt=""&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;For APEX Interactive Reports watch there:&lt;br&gt;&lt;a href="http://dgielis.blogspot.com/2008/11/group-headings-in-interactive-report.html"&gt;Dimitri Gielis: Group Headings in an Interactive Report (APEX)&lt;/a&gt;&lt;br&gt;And there:&lt;br&gt;&lt;a href="http://apex-smb.blogspot.com/2009/03/column-groups-in-apex-interactive.html"&gt;Martin Giffy D'Souza: Column Groups in APEX Interactive Reports&lt;/a&gt;&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/6481483192141562388-8751145259236489778?l=apex-at-work.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/orana_apex/~4/opT6nZy_7-w" height="1" width="1"/&gt;</description><feedburner:origLink>http://apex-at-work.blogspot.com/2010/03/column-header-groups-in-apex-report.html</feedburner:origLink></item><item><title>My Interview with Mike Riley</title><link>http://feedproxy.google.com/~r/orana_apex/~3/3FjLi_5y9tQ/my-interview-with-mike-riley.html</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Scott</dc:creator><pubDate>Mon, 08 Mar 2010 07:34:08 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/3ea8fdd3b66dcd1e</guid><description>Recently, I sat down with ODTUG President Mike Riley and answered a few questions about the upcoming &lt;a href="http://odtugkaleidoscope.com/"&gt;ODTUG Kaleidoscope&lt;/a&gt; Conference which will be held in Washington, DC this year.  (OK, we didn&amp;#39;t actually sit down together, but I answered his questions nevertheless!)&lt;br&gt;&lt;br&gt;Have a look at my interview &lt;a href="http://odtug.wordpress.com/2010/03/08/scott-spendolini-odtug-kaleidoscope-and-washington-dc/"&gt;here&lt;/a&gt;.&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/8449039-5088322357259641942?l=spendolini.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/orana_apex/~4/3FjLi_5y9tQ" height="1" width="1"/&gt;</description><feedburner:origLink>http://spendolini.blogspot.com/2010/03/my-interview-with-mike-riley.html</feedburner:origLink></item><item><title>Oracle APEX 4.0 Early Adopter Blog Coverage – Part 3</title><link>http://feedproxy.google.com/~r/orana_apex/~3/2-1NTCjYbUE/</link><category>News</category><category>Plug-ins</category><category>beta</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Patrick Wolf</dc:creator><pubDate>Fri, 05 Mar 2010 02:05:13 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/0adc517587d79b52</guid><description>&lt;p&gt;&lt;a title="Permanent Link to Oracle APEX 4.0 Early Adopter Blog Coverage – Part 3" href="http://www.inside-oracle-apex.com/oracle-apex-4-0-early-adopter-blog-coverage-part-3/" rel="bookmark"&gt;&lt;img src="http://www.inside-oracle-apex.com/blog/wp-content/uploads/in_the_news.jpg" alt="Oracle APEX 4.0 Early Adopter Blog Coverage – Part 3"&gt;&lt;/a&gt;&lt;/p&gt;
            		        Since my last Oracle APEX 4.0 blog coverage – Part 2 posting, new articles have been posted about our early adopter release 2. Have fun reading them!

APEX 4.0 EA2 – Websheets by Dimitri Gielis
[Oracle APEX 4.0] Text Field with autocomplete by Whitehorses
APEX 4.0 EA2: Improved debugging, my new favorite feature by Mark Lancaster
[Oracle APEX 4.0] [...]&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/InsideApex?a=LLIMbkPzlcE:UqV3hcl6-fw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/InsideApex?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/InsideApex?a=LLIMbkPzlcE:UqV3hcl6-fw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/InsideApex?i=LLIMbkPzlcE:UqV3hcl6-fw:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/InsideApex?a=LLIMbkPzlcE:UqV3hcl6-fw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/InsideApex?i=LLIMbkPzlcE:UqV3hcl6-fw:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/InsideApex?a=LLIMbkPzlcE:UqV3hcl6-fw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/InsideApex?d=7Q72WNTAKBA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/InsideApex?a=LLIMbkPzlcE:UqV3hcl6-fw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/InsideApex?d=qj6IDK7rITs" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InsideApex/~4/LLIMbkPzlcE" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/orana_apex/~4/2-1NTCjYbUE" height="1" width="1"/&gt;</description><feedburner:origLink>http://feedproxy.google.com/~r/InsideApex/~3/LLIMbkPzlcE/</feedburner:origLink></item><item><title>Oracle APEX 4.0 – New Features in Early Adopter 2</title><link>http://feedproxy.google.com/~r/orana_apex/~3/mfWjiDdUrAI/</link><category>APEX 4.0</category><category>beta</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Patrick Wolf</dc:creator><pubDate>Thu, 04 Mar 2010 03:04:15 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/949b56200dc282c0</guid><description>&lt;p&gt;&lt;a title="Permanent Link to Oracle APEX 4.0 – New Features in Early Adopter 2" href="http://www.inside-oracle-apex.com/oracle-apex-4-0-new-features-in-early-adopter-2/" rel="bookmark"&gt;&lt;img src="http://www.inside-oracle-apex.com/blog/wp-content/uploads/new.png" alt="Oracle APEX 4.0 – New Features in Early Adopter 2"&gt;&lt;/a&gt;&lt;/p&gt;
            		        It took a little bit longer as expected, but the new feature list of Oracle APEX 4.0 Early Adopter 2 is now online (link is at the end of the posting). The list contains the EA1 features as well. Hopefully we didn’t miss any new feature, there are to many to count. One of the [...]&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/InsideApex?a=7epM7CG7kA4:BfN_0JFdCps:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/InsideApex?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/InsideApex?a=7epM7CG7kA4:BfN_0JFdCps:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/InsideApex?i=7epM7CG7kA4:BfN_0JFdCps:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/InsideApex?a=7epM7CG7kA4:BfN_0JFdCps:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/InsideApex?i=7epM7CG7kA4:BfN_0JFdCps:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/InsideApex?a=7epM7CG7kA4:BfN_0JFdCps:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/InsideApex?d=7Q72WNTAKBA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/InsideApex?a=7epM7CG7kA4:BfN_0JFdCps:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/InsideApex?d=qj6IDK7rITs" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InsideApex/~4/7epM7CG7kA4" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/orana_apex/~4/mfWjiDdUrAI" height="1" width="1"/&gt;</description><feedburner:origLink>http://feedproxy.google.com/~r/InsideApex/~3/7epM7CG7kA4/</feedburner:origLink></item><item><title>APEX 4.0 EA2 - Websheets</title><link>http://feedproxy.google.com/~r/orana_apex/~3/pGW8_NwCG7w/apex-40-ea2-websheets.html</link><category>websheets</category><category>apex 4.0</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dimitri Gielis</dc:creator><pubDate>Thu, 04 Mar 2010 03:27:05 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/72f4a332cc5f64a1</guid><description>In &lt;a href="http://tryapexnow.com/"&gt;APEX 4.0 EA2&lt;/a&gt; the Websheet functionality is enabled. Websheets allow you to share information with others in a very quick, user friendly and secure way.&lt;br&gt;&lt;br&gt;Let's have a look at an example. If you go to Application Builder in APEX 4.0 there is a new type there called "Websheet Applications".&lt;br&gt;&lt;br&gt;&lt;a href="http://1.bp.blogspot.com/_tffIKLFlRlY/S4-OugQZp0I/AAAAAAAAFk8/DbkKECZ1z4s/s1600-h/Screen+shot+2010-03-01+at+10.34.26.png"&gt;&lt;img style="display:block;margin:0px auto 10px;text-align:center;width:400px;height:63px" src="http://1.bp.blogspot.com/_tffIKLFlRlY/S4-OugQZp0I/AAAAAAAAFk8/DbkKECZ1z4s/s400/Screen+shot+2010-03-01+at+10.34.26.png" alt="" border="0"&gt;&lt;/a&gt;&lt;br&gt;&lt;a href="http://3.bp.blogspot.com/_tffIKLFlRlY/S4-OsBuVvHI/AAAAAAAAFk0/MKAlJGIRQ10/s1600-h/Screen+shot+2010-03-01+at+10.34.40.png"&gt;&lt;img style="display:block;margin:0px auto 10px;text-align:center;width:400px;height:171px" src="http://3.bp.blogspot.com/_tffIKLFlRlY/S4-OsBuVvHI/AAAAAAAAFk0/MKAlJGIRQ10/s400/Screen+shot+2010-03-01+at+10.34.40.png" alt="" border="0"&gt;&lt;/a&gt;We create a new Websheet Application and give it a name and possibly some content that will appear on the home page. You can type the content with the WYSIWYG editor (CK Editor) by clicking on the arrow button.&lt;br&gt;&lt;br&gt;&lt;a href="http://4.bp.blogspot.com/_tffIKLFlRlY/S4-OptVEaKI/AAAAAAAAFks/xhUz96eedNM/s1600-h/Screen+shot+2010-03-01+at+10.35.25.png"&gt;&lt;img style="display:block;margin:0px auto 10px;text-align:center;width:400px;height:252px" src="http://4.bp.blogspot.com/_tffIKLFlRlY/S4-OptVEaKI/AAAAAAAAFks/xhUz96eedNM/s400/Screen+shot+2010-03-01+at+10.35.25.png" alt="" border="0"&gt;&lt;/a&gt;&lt;br&gt;Before it creates the Websheets, the wizard gives a summary page and that is it.&lt;br&gt;Websheets are even simpler to create than a normal APEX (database) application.&lt;br&gt;&lt;br&gt;&lt;a href="http://3.bp.blogspot.com/_tffIKLFlRlY/S4-Ol3QGMnI/AAAAAAAAFkk/54trg6JLdZo/s1600-h/Screen+shot+2010-03-01+at+10.35.34.png"&gt;&lt;img style="display:block;margin:0px auto 10px;text-align:center;width:400px;height:161px" src="http://3.bp.blogspot.com/_tffIKLFlRlY/S4-Ol3QGMnI/AAAAAAAAFkk/54trg6JLdZo/s400/Screen+shot+2010-03-01+at+10.35.34.png" alt="" border="0"&gt;&lt;/a&gt;You can compare Websheets with a preconfigured APEX application. A whole Framework is build for you with a lot of features out-of-the-box. You can just use all that.&lt;br&gt;&lt;br&gt;When you run the Websheet from the App Builder you come into "Websheet-land". As a default Authentication mechanism it uses the Application Express Account. But you can change that by going into the Websheet Properties to Public Access, Single Sign On, LDAP or Custom.&lt;br&gt;&lt;br&gt;&lt;a href="http://3.bp.blogspot.com/_tffIKLFlRlY/S4-OjPpBYHI/AAAAAAAAFkc/zOtEEoDnKfw/s1600-h/Screen+shot+2010-03-01+at+10.35.46.png"&gt;&lt;img style="display:block;margin:0px auto 10px;text-align:center;width:400px;height:210px" src="http://3.bp.blogspot.com/_tffIKLFlRlY/S4-OjPpBYHI/AAAAAAAAFkc/zOtEEoDnKfw/s400/Screen+shot+2010-03-01+at+10.35.46.png" alt="" border="0"&gt;&lt;/a&gt;&lt;br&gt;When logged in, you come into the Websheet Framework. As we have Websheet Development Access, we can change the Websheet. In the top menu and on the right hand side you see what you can do. E.g. you can add pages, sections, data grids etc. There's a lot to explore there!&lt;br&gt;&lt;br&gt;&lt;a href="http://3.bp.blogspot.com/_tffIKLFlRlY/S4-OfV0cpBI/AAAAAAAAFkU/zagnKWrTt1s/s1600-h/Screen+shot+2010-03-01+at+10.36.11.png"&gt;&lt;img style="display:block;margin:0px auto 10px;text-align:center;width:400px;height:220px" src="http://3.bp.blogspot.com/_tffIKLFlRlY/S4-OfV0cpBI/AAAAAAAAFkU/zagnKWrTt1s/s400/Screen+shot+2010-03-01+at+10.36.11.png" alt="" border="0"&gt;&lt;/a&gt;&lt;br&gt;In the different sections of the page you also have Edit links, which  allow you to easily change the text, all with a (WYSIWYG) html editor.&lt;br&gt;&lt;br&gt;&lt;a href="http://3.bp.blogspot.com/_tffIKLFlRlY/S4-OVjcb2NI/AAAAAAAAFkM/G1h8BEXdaSY/s1600-h/Screen+shot+2010-03-01+at+10.36.44.png"&gt;&lt;img style="display:block;margin:0px auto 10px;text-align:center;width:400px;height:183px" src="http://3.bp.blogspot.com/_tffIKLFlRlY/S4-OVjcb2NI/AAAAAAAAFkM/G1h8BEXdaSY/s400/Screen+shot+2010-03-01+at+10.36.44.png" alt="" border="0"&gt;&lt;/a&gt;&lt;br&gt;I see two big parts of Websheets; sharing information and data. The information is done through using Pages, sections, tags, files etc. just like you do in a Wiki/CMS. But where it outperforms all the typical wiki or content management systems, is with the data part!&lt;br&gt;&lt;br&gt;One of the killer features of Websheets are the Data Grids. If you go to Data &amp;gt; Data Grids and create a new Data Grid, you have the choice to start from scratch or from Excel/Text with copy/paste. That allows you to create &amp;quot;a table&amp;quot; on the fly which holds your data (actually it&amp;#39;s a record in the Websheet repository). This Data Grid look very similar to an Interactive Report (see Actions button), but it allows to do inline editing and a lot more (see Manage button)!&lt;br&gt;&lt;br&gt;&lt;a href="http://1.bp.blogspot.com/_tffIKLFlRlY/S4-OQpox81I/AAAAAAAAFkE/gK48DHaIDiM/s1600-h/Screen+shot+2010-03-01+at+10.51.33.png"&gt;&lt;img style="display:block;margin:0px auto 10px;text-align:center;width:400px;height:148px" src="http://1.bp.blogspot.com/_tffIKLFlRlY/S4-OQpox81I/AAAAAAAAFkE/gK48DHaIDiM/s400/Screen+shot+2010-03-01+at+10.51.33.png" alt="" border="0"&gt;&lt;/a&gt;Websheets are too big to discuss in one blog post. There are so many areas which could be covered. There's the wiki part, the data part, the administration (security, dashboards), ...&lt;br&gt;&lt;br&gt;Maybe one last thing... look at the url of a &lt;a href="http://tryapexnow.com/apex/ws?p=626:home"&gt;Websheet&lt;/a&gt; (login with end/end)... it doesn't start with &lt;span style="font-weight:bold"&gt;f?p&lt;/span&gt;... it starts with &lt;span style="font-weight:bold"&gt;ws?p&lt;/span&gt; ;-)&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/21122514-4889534369372827710?l=dgielis.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/orana_apex/~4/pGW8_NwCG7w" height="1" width="1"/&gt;</description><feedburner:origLink>http://dgielis.blogspot.com/2010/03/apex-40-ea2-websheets.html</feedburner:origLink></item><item><title>DOCX Part II: How to Index Document Content With Oracle Text</title><link>http://feedproxy.google.com/~r/orana_apex/~3/1Han-TNQo1o/docx-part-ii-how-to-index-document.html</link><category>text index</category><category>apex</category><category>oracle</category><category>docx</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Håvard Kristiansen</dc:creator><pubDate>Tue, 02 Mar 2010 03:35:43 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/d6e5e4055de33c94</guid><description>Here I will demonstrate how to index content of CLOB data using Oracle Text. Other than the database objects used in the example, the post addresses the use of Oracle Text in a general way, and will work for any CLOB column. There is no ground breaking code here, but it completes the example on how to handle Microsoft Open Office XML Format (DOCX) documents. The examples and content here are based on &lt;a href="http://monkeyonoracle.blogspot.com/2010/03/docx-part-i-how-to-extract-document.html"&gt;my previous post&lt;/a&gt;.&lt;br&gt;&lt;div style="clear:both;text-align:center"&gt;&lt;a href="http://4.bp.blogspot.com/_8GtRvOur8pQ/S4zuzgUb6oI/AAAAAAAAACQ/zpzENrehA5k/s1600-h/lupa.jpg" style="margin-left:1em;margin-right:1em"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_8GtRvOur8pQ/S4zuzgUb6oI/AAAAAAAAACQ/zpzENrehA5k/s320/lupa.jpg"&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;The code here is tested with Oracle database release 11.1.0.6, but should work with releases down to 10g. When I say "tested", remember I am a developer, so it basically means it does compile and it did give the expected result on &lt;i&gt;one&lt;/i&gt; run trough...&lt;br&gt;&lt;br&gt;&lt;b&gt;See it in Action&lt;/b&gt;&lt;br&gt;I have included a search page in my demo application. Upload a DOCX document, and try it for yourself: &lt;a href="http://apex.oracle.com/pls/apex/f?p=28990:20"&gt;Go to demo application&lt;/a&gt;.&lt;br&gt;&lt;br&gt;&lt;b&gt;About Oracle Text&lt;/b&gt;&lt;br&gt;Oracle Text (formerly Oracle interMedia) is Oracles full-text retrieval technology, and part of Standard, Enterprise and even XE editions of the database. See &lt;a href="http://www.oracle.com/technology/products/text/index.html"&gt;Oracle Text on oracle.com&lt;/a&gt; for more information.&lt;br&gt;&lt;br&gt;In my case I will use it to index text content stored in a CLOB column, and utilize it's search capabilities to enable users to retrieve relevant results based on search phrases.&lt;br&gt;&lt;br&gt;&lt;b&gt;Indexing CLOBs&lt;/b&gt;&lt;br&gt;Or BLOBs, or BFILEs, for that matter. It is very easy to get up and running with a text index. The following code is all that is needed to get a text index up and running against the TEXT_CONTENT column of the SAMPLES_DOCX table:&lt;br&gt;&lt;pre&gt;create index samples_docx_ctx on samples_docx&lt;br&gt;(text_content)&lt;br&gt;indextype is ctxsys.context&lt;br&gt;/&lt;br&gt;&lt;/pre&gt;That's it! If you want to get fancy, there are a number of options and ways to enhance the indexing, look at &lt;a href="http://download.oracle.com/docs/cd/B28359_01/text.111/b28303/ind.htm"&gt;the documentation&lt;/a&gt; for more information on the subject (lexers, sections, stopword lists, etc.).&lt;br&gt;&lt;br&gt;&lt;b&gt;Searching with Oracle Text&lt;/b&gt;&lt;br&gt;With the text index in place, the next step is to use the index to retrieve search results. In my example I will use a technique called "Progressive Relaxation" as described by Roger Ford &lt;a href="http://www.oracle.com/technology/products/text/htdocs/prog_relax.html"&gt;here&lt;/a&gt;. It uses a query template to implement a progressive relaxation of the search tokens.&lt;br&gt;&lt;br&gt;The following script creates a package to handle and use the new text index:&lt;br&gt;&lt;pre&gt;create or replace package samples_docx_search_p&lt;br&gt;as&lt;br&gt;   -- result types&lt;br&gt;   type t_result_rec is record (&lt;br&gt;      score         number,&lt;br&gt;      filename      samples_docx.filename%type,&lt;br&gt;      snippet       varchar2(4000));&lt;br&gt;   type t_result_tab is table of t_result_rec;&lt;br&gt;   -- synchronize search index&lt;br&gt;   procedure sync_search_index (&lt;br&gt;      p_ctx_index_name     in          varchar2 default 'SAMPLES_DOCX_CTX'&lt;br&gt;   );&lt;br&gt;   -- search docx content&lt;br&gt;   function search_text (&lt;br&gt;      p_tokens    in          varchar2&lt;br&gt;   ) return t_result_tab pipelined;&lt;br&gt;end;&lt;br&gt;/&lt;br&gt;&lt;br&gt;create or replace package body samples_docx_search_p&lt;br&gt;as&lt;br&gt;   -- synchronize search index&lt;br&gt;   procedure sync_search_index (&lt;br&gt;      p_ctx_index_name     in          varchar2 default 'SAMPLES_DOCX_CTX'&lt;br&gt;   ) is&lt;br&gt;   begin&lt;br&gt;      ctx_ddl.sync_index(p_ctx_index_name, '2M');&lt;br&gt;   end;&lt;br&gt;   -- search docx content&lt;br&gt;   function search_text (&lt;br&gt;      p_tokens    in          varchar2&lt;br&gt;   ) return t_result_tab pipelined&lt;br&gt;   as &lt;br&gt;      l_max_rows         integer := 10;&lt;br&gt;      l_counter          integer := 0;&lt;br&gt;      l_ret_rec          t_result_rec;&lt;br&gt;      l_tokens           varchar2(4000) := lower(p_tokens); &lt;br&gt;      l_query_template   varchar2(32000):=&amp;#39;&amp;lt;query&amp;gt;&amp;#39;&lt;br&gt;                              ||chr(10)||&amp;#39;   &amp;lt;textquery&amp;gt; heregoesthetokens&amp;#39;&lt;br&gt;                              ||chr(10)||&amp;#39;     &amp;lt;progression&amp;gt;&amp;#39;&lt;br&gt;                              ||chr(10)||&amp;#39;       &amp;lt;seq&amp;gt;&amp;lt;rewrite&amp;gt;transform((TOKENS, &amp;quot;{&amp;quot;, &amp;quot;}&amp;quot;, &amp;quot; &amp;quot;))&amp;lt;/rewrite&amp;gt;&amp;lt;/seq&amp;gt;&amp;#39;&lt;br&gt;                              ||chr(10)||&amp;#39;       &amp;lt;seq&amp;gt;&amp;lt;rewrite&amp;gt;transform((TOKENS, &amp;quot;{&amp;quot;, &amp;quot;}&amp;quot;, &amp;quot;AND&amp;quot;))&amp;lt;/rewrite&amp;gt;/seq&amp;gt;&amp;#39;&lt;br&gt;                              ||chr(10)||&amp;#39;       &amp;lt;seq&amp;gt;&amp;lt;rewrite&amp;gt;transform((TOKENS, &amp;quot;?{&amp;quot;, &amp;quot;}&amp;quot;, &amp;quot;AND&amp;quot;))&amp;lt;/rewrite&amp;gt;&amp;lt;/seq&amp;gt;&amp;#39;&lt;br&gt;                              ||chr(10)||&amp;#39;       &amp;lt;seq&amp;gt;&amp;lt;rewrite&amp;gt;transform((TOKENS, &amp;quot;{&amp;quot;, &amp;quot;}&amp;quot;, &amp;quot;OR&amp;quot;))&amp;lt;/rewrite&amp;gt;&amp;lt;/seq&amp;gt;&amp;#39;&lt;br&gt;                              ||chr(10)||&amp;#39;       &amp;lt;seq&amp;gt;&amp;lt;rewrite&amp;gt;transform((TOKENS, &amp;quot;?{&amp;quot;, &amp;quot;}&amp;quot;, &amp;quot;OR&amp;quot;))&amp;lt;/rewrite&amp;gt;&amp;lt;/seq&amp;gt;&amp;#39;&lt;br&gt;                              ||chr(10)||&amp;#39;     &amp;lt;/progression&amp;gt;&amp;#39;&lt;br&gt;                              ||chr(10)||&amp;#39;   &amp;lt;/textquery&amp;gt;&amp;#39;&lt;br&gt;                              ||chr(10)||&amp;#39;&amp;lt;/query&amp;gt;&amp;#39;;&lt;br&gt;      l_query            varchar2(32000);&lt;br&gt;   begin&lt;br&gt;      if l_tokens is null&lt;br&gt;      then&lt;br&gt;         return;&lt;br&gt;      end if;&lt;br&gt;      -- create query temlpate based on tokens&lt;br&gt;      l_query_template := replace(l_query_template, 'heregoesthetokens', l_tokens);&lt;br&gt;      -- restructure tokens for use with snippet&lt;br&gt;      l_tokens := replace(l_tokens, ' ', ' | ');&lt;br&gt;      for c in (select rowid&lt;br&gt;                     , filename &lt;br&gt;                  from samples_docx &lt;br&gt;                 where contains (text_content, l_query_template, 1) &amp;gt; 0)&lt;br&gt;      loop&lt;br&gt;         -- crude custom score, just listing the results as they come&lt;br&gt;         l_ret_rec.score := l_counter;&lt;br&gt;         l_ret_rec.filename := c.filename;&lt;br&gt;         -- create snippet (with tokenbased highlight) of content to return to the user&lt;br&gt;         ctx_doc.set_key_type('ROWID');&lt;br&gt;         l_ret_rec.snippet :=  ctx_doc.snippet(&amp;#39;SAMPLES_DOCX_CTX&amp;#39;, c.rowid, l_tokens, &amp;#39;&amp;lt;b&amp;gt;&amp;#39;, &amp;#39;&amp;lt;/b&amp;gt;&amp;#39;, false);&lt;br&gt;         l_counter := l_counter + 1;&lt;br&gt;         -- return row&lt;br&gt;         pipe row (l_ret_rec);&lt;br&gt;         -- exit when max number of rows exceeded&lt;br&gt;         exit when l_counter &amp;gt;= l_max_rows;&lt;br&gt;      end loop;&lt;br&gt;   end;&lt;br&gt;end;&lt;br&gt;/&lt;br&gt;&lt;/pre&gt;Some parts of the code are more cryptic than others.&lt;br&gt;&lt;br&gt;First up is the "SYNC_SEARCH_INDEX" procedure. It's sole purpose is to synchronize the search index with the TEXT_CONTENT column. When you perform DML on the TEXT_CONTENT column, changes to the text index does not automatically propagate to the search index (unless the index is explicitly told to do so). So, in this example, if you insert a new row, the TEXT_CONTENT will not show up through Oracle Text searches until you have told it to synchronize the index. Indexing can be a resource demanding operation, so it makes sense to separate table DML from the indexing job.&lt;br&gt;&lt;br&gt;In short: &lt;i&gt;Make sure you synchronize the text index after DML on the indexed column has been performed&lt;/i&gt;.&lt;br&gt;&lt;br&gt;Next is the &amp;quot;SEARCH_TEXT&amp;quot; function, particularly the query template. In the past I have used Oracle Text in its most simple form, but query templates adds a new dimension to controlling your searches. Basically you define how you want to use the search tokens (search phrase) to find matches in the text index. It is written in XML-form, and the &amp;lt;seq&amp;gt;-tag states the order of which you want to process your criteria. For more information on query templates, take a look at &lt;a href="http://download.oracle.com/docs/cd/B28359_01/text.111/b28303/query.htm"&gt;the documentation&lt;/a&gt;.&lt;br&gt;&lt;br&gt;A short explanation on the query template:&lt;br&gt;&lt;ul&gt;&lt;li&gt;&amp;lt;rewrite&amp;gt;transform((TOKENS, &amp;quot;{&amp;quot;, &amp;quot;}&amp;quot;, &amp;quot; &amp;quot;))&amp;lt;/rewrite&amp;gt;: Matches when whole phrase (tokens in order) is present within document&lt;/li&gt;&lt;li&gt;&amp;lt;rewrite&amp;gt;transform((TOKENS, &amp;quot;{&amp;quot;, &amp;quot;}&amp;quot;, &amp;quot;AND&amp;quot;))&amp;lt;/rewrite&amp;gt;: Matches when each token is present within document&lt;/li&gt;&lt;li&gt;&amp;lt;rewrite&amp;gt;transform((TOKENS, &amp;quot;?{&amp;quot;, &amp;quot;}&amp;quot;, &amp;quot;AND&amp;quot;))&amp;lt;/rewrite&amp;gt;: Matches when each token is present within docoument, allowing typos (fussy search)&lt;/li&gt;&lt;li&gt;&amp;lt;rewrite&amp;gt;transform((TOKENS, &amp;quot;{&amp;quot;, &amp;quot;}&amp;quot;, &amp;quot;OR&amp;quot;))&amp;lt;/rewrite&amp;gt;: Matches when any of the tokens are present within document&lt;/li&gt;&lt;li&gt;&amp;lt;rewrite&amp;gt;transform((TOKENS, &amp;quot;?{&amp;quot;, &amp;quot;}&amp;quot;, &amp;quot;OR&amp;quot;))&amp;lt;/rewrite&amp;gt;: Matches when any of the tokens are present within document, allowing typos (fussy search)&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;Although it will return matches according to the sequence, the "score" within the sequence will be random (as far as I could see at least), so the "score" column in the example above needs a bit of work. I also learned the hard way that structure of the XML in the query template is not validated, and it swallows typos without a word.&lt;br&gt;&lt;br&gt;&lt;b&gt;Test the Code&lt;/b&gt;&lt;br&gt;You can test the code directly from SQL*Plus or your favorite weapon of choice. The following code will search for "test":&lt;br&gt;&lt;pre&gt;select filename&lt;br&gt;,      snippet&lt;br&gt;from   table(samples_docx_search_p.search_text('test'))&lt;br&gt;order  by score&lt;br&gt;/&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;b&gt;Wildcards&lt;/b&gt;&lt;br&gt;My query template does not support searching for parts of words, there are some reasons for this behavior.&lt;br&gt;&lt;ul&gt;&lt;li&gt;Wildcard searches requires more resources&lt;/li&gt;&lt;li&gt;The results returned will be unpredictable. Imagine searching for "ora*", both "oracle" and "orange" will match.&lt;/li&gt;&lt;li&gt;Wildcard searches are more suitable for look-ups in structured data&lt;/li&gt;&lt;/ul&gt;What did I mean by that last statement? As I see it, users today are using a wide range of search engines and site searches every day, and wildcard matching are in most cases available only through the "advanced search"-link (that is rarely used, if ever). Let alone that people do not expect this kind of behavior anymore. If you want to help the user, add ajax autocomplete to your search field, and use the Oracle Text index. In the traditional back office application, it is another matter (look-ups and such).&lt;br&gt;&lt;br&gt;&lt;b&gt;Create a Search Page in Oracle APEX&lt;/b&gt;&lt;br&gt;I will not do a detailed explanation here, but creating a report based on a query will do the trick. If you choose "Yes" for "Enable search" in the wizard it will save you some work by creating the search dialog on the page. Clean up the query in the report region so that tour query looks something like this:&lt;br&gt;&lt;pre&gt;select filename&lt;br&gt;,      snippet&lt;br&gt;from   table(samples_docx_search_p.search_text(:PXX_REPORT_SEARCH))&lt;br&gt;order  by score&lt;br&gt;&lt;/pre&gt;When keeping the order by, I assume that you will let the score column determine the result order. For good measure you can create a row template for the result representation in the APEX report so you can have heading and snippet spread over two rows.&lt;br&gt;&lt;br&gt;&lt;b&gt;Update Sample Upload Page&lt;/b&gt;&lt;br&gt;If you created the upload page described in my previous post, include a new page process (After Submit, and after the "extract_text"-process). The process should be of PL/SQL-type, and the code should look something like this:&lt;br&gt;&lt;pre&gt;samples_docx_search_p.sync_search_index;&lt;br&gt;&lt;/pre&gt;It does not necessary have to be a page process, but it is important to synchronize the text index after DML.&lt;br&gt;&lt;br&gt;&lt;b&gt;How to Handle DOC and DOCX&lt;/b&gt;&lt;br&gt;...And PDF, XLS, PPT, etc. Well, the DOCX is the exception here. Oracle Text does not understand the format yet (unless you are running on release 11.1.0.7 or higher). If you create an Oracle Text index on a BLOB column containing other file types which it does understand, they will be indexed automagically. If you want to index the content of a DOCX document in the same index, use the technique described in my last post, convert the output (plain text) into a BLOB, and insert the BLOB into the table with the other documents. Or said in a different way: you except and handle DOCX documents differently than the known document types.&lt;br&gt;&lt;br&gt;Querying an Oracle Text index works the same for BLOB and CLOB columns.&lt;br&gt;&lt;br&gt;There is definitely room for improvement in the code, but it serves well enough for demonstration purposes.&lt;br&gt;&lt;br&gt;Enjoy :-)&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/8575920265455783910-1533033544688537738?l=monkeyonoracle.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/orana_apex/~4/1Han-TNQo1o" height="1" width="1"/&gt;</description><feedburner:origLink>http://monkeyonoracle.blogspot.com/2010/03/docx-part-ii-how-to-index-document.html</feedburner:origLink></item><item><title>AJAX based select list in APEX - Part 2</title><link>http://feedproxy.google.com/~r/orana_apex/~3/Vvqfo5NWJJ8/ajax-based-select-list-in-apex-update.html</link><category>APEX examples</category><category>EXTJS</category><category>APEX issues</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Tobias Arnhold</dc:creator><pubDate>Mon, 01 Mar 2010 14:31:47 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/193f9a63455ac036</guid><description>I couple of days ago I wrote about a way &lt;a href="http://apex-at-work.blogspot.com/2010/02/ajax-based-select-list-in-apex.html"&gt;using AJAX based select lists in APEX&lt;/a&gt;.&lt;br&gt;After some hints from &lt;a href="http://www.oracle-and-apex.com/"&gt;Peter Raganitsch&lt;/a&gt; I tried the ApexLib Framework but I run into some issues with ExtJS.&lt;br&gt;&lt;span style="font-weight:bold"&gt;Error message:&lt;/span&gt;&lt;br&gt;vFieldValue is undefined&lt;br&gt;populateLovField(Object { name="pFieldId"}, Object { name="pLovEntry"})ApexLib_Full.js&lt;br&gt;populateDependingLovs(Object { name="pFieldId"})ApexLib_Full.js&lt;br&gt;(?)()ApexLib_Full.js&lt;br&gt;(?)(Object { name="pEvent"})ApexLib_Full.js&lt;br&gt;vAjaxRequest.add(pLovEntry.oUsedFi...ace(/\:/g, String.fromCharCode(1)));&lt;br&gt;&lt;span style="font-weight:bold"&gt;&lt;br&gt;Error part where somehow an ExtJS function got called:&lt;/span&gt;&lt;br&gt;vAjaxRequest.add(pLovEntry.oUsedFieldList[ii], vFieldValue.replace(/\:/g, String.fromCharCode(1)));&lt;br&gt;&lt;br&gt;I found another solution from Carl Backstrom: &lt;a href="http://htmldb.oracle.com/pls/otn/f?p=11933:37"&gt;Ajax Selects&lt;/a&gt;&lt;br&gt;I modified his script a bit and used it in my environment.&lt;br&gt;&lt;br&gt;Using the ApexLib would have been much easier luckily I just had a really small application. &lt;br&gt;&lt;br&gt;Good for us that APEX 4.0 will solve these problems by a new standard feature:&lt;br&gt;&lt;a href="http://www.inside-oracle-apex.com/oracle-apex-4-0-cascading-lovsselect-lists/"&gt;Oracle APEX 4.0: Cascading LOVs/Select Lists&lt;/a&gt;&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/6481483192141562388-6311503617336656284?l=apex-at-work.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/orana_apex/~4/Vvqfo5NWJJ8" height="1" width="1"/&gt;</description><feedburner:origLink>http://apex-at-work.blogspot.com/2010/03/ajax-based-select-list-in-apex-update.html</feedburner:origLink></item><item><title>Get a Suite Deal at ODTUG</title><link>http://feedproxy.google.com/~r/orana_apex/~3/JEbTxfDmyRM/get-suite-deal-at-odtug.html</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Scott</dc:creator><pubDate>Mon, 01 Mar 2010 11:49:01 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/faf0dc0ccd7cd993</guid><description>As Dimitri &lt;a href="http://dgielis.blogspot.com/2010/02/get-me-suite-at-odtug.html"&gt;mentioned&lt;/a&gt;, one way to get a Suite at this year&amp;#39;s ODTUG is to mention his (or my) name when you register.  Now, there&amp;#39;s another way:  just create a 3-minute video on &amp;quot;&lt;b&gt;Why You Need to Attend ODTUG Kaleidoscope 2010&lt;/b&gt;".&lt;br&gt;&lt;br&gt;Here's the details via the folks at ODTUG:&lt;br&gt;&lt;br&gt;Make it funny…or Make it musical…or Make it informational…or Make it Rhyme…or…???. Use your imagination to create the catchiest video possible. Make sure to include the ODTUG Kaleidoscope logo.&lt;br&gt;&lt;div style="margin-bottom:0pt;margin-left:0in;margin-right:0in;margin-top:0in"&gt;&lt;/div&gt;&lt;div style="margin-bottom:0pt;margin-left:0in;margin-right:0in;margin-top:0in"&gt;&lt;br&gt;&lt;/div&gt;&lt;div style="margin-bottom:0pt;margin-left:0in;margin-right:0in;margin-top:0in"&gt;To submit your video for consideration, send an &lt;a href="mailto:crystal@odtug.com"&gt;e-mail to ODTUG&lt;/a&gt; with your name and YouTube video link.&lt;/div&gt;&lt;div style="margin-bottom:0pt;margin-left:0in;margin-right:0in;margin-top:0in"&gt;&lt;br&gt;&lt;/div&gt;&lt;div style="margin-bottom:0pt;margin-left:0in;margin-right:0in;margin-top:0in"&gt;&lt;i&gt;Video Contest Guidelines: Video must be three minutes or less, contain no inappropriate content, and be posted publicly to YouTube by March 31, midnight&lt;span&gt; &lt;/span&gt;EST. All videos must remain in public domain until after July 1&lt;sup&gt;st&lt;/sup&gt;, 2010.  The winning video will be selected from among all the entries.  The judges’ decision will be final.  Judges may include members of the ODTUG Kaleidoscope Conference Committee and others.  Winner will be notified by April 2&lt;sup&gt;nd&lt;/sup&gt;, 2010. Winner will have the choice of a complimentary non-transferable registration &lt;span&gt;to ODTUG Kaleidoscope 2010 &lt;/span&gt;or a suite upgrade at theMarriott Wardman Park.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/8449039-4249745045077769795?l=spendolini.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/orana_apex/~4/JEbTxfDmyRM" height="1" width="1"/&gt;</description><feedburner:origLink>http://spendolini.blogspot.com/2010/03/get-suite-deal-at-odtug.html</feedburner:origLink></item><item><title>DOCX Part I: How to Extract Document Content as Plain Text</title><link>http://feedproxy.google.com/~r/orana_apex/~3/LWgQ-y4a6oA/docx-part-i-how-to-extract-document.html</link><category>plsql</category><category>apex</category><category>oracle</category><category>docx</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Håvard Kristiansen</dc:creator><pubDate>Mon, 01 Mar 2010 06:48:33 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/1e9d67cfb7406309</guid><description>In this post I will demonstrate how to extract plain text from Microsoft Open Office XML Format (DOCX) documents stored as a BLOB data type in an Oracle database. It is part one of two posts concerning how to extract and index unstructured content stored in DOCX files. I found snippets of solutions several places, but no complete copy-paste solution, so perhaps this will save some of you a bit of work.&lt;br&gt;&lt;div style="clear:both;text-align:center"&gt;&lt;a href="http://1.bp.blogspot.com/_8GtRvOur8pQ/S4vHvKHjyvI/AAAAAAAAACI/pa5eiB_fIVk/s1600-h/text.jpg" style="margin-left:1em;margin-right:1em"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_8GtRvOur8pQ/S4vHvKHjyvI/AAAAAAAAACI/pa5eiB_fIVk/s320/text.jpg"&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;The solution is tested on Oracle database Enterprise Edition release 11.1.0.6 with Apex 3.2.1 running on Windows XP, but should work down to 10g Standard Edition (not Oracle XE, since part of the code is in Java).&lt;br&gt;&lt;br&gt;&lt;b&gt;See it In Action&lt;/b&gt;&lt;br&gt;I have updated my demo application with a couple of pages so you can try it out yourselves: &lt;a href="http://apex.oracle.com/pls/apex/f?p=28990:20"&gt;Go to demo application&lt;/a&gt;. There is a limited space available at apex.oracle.com, so please take care when uploading (and it is very easy to test in your own environment).&lt;br&gt;&lt;b&gt;&lt;br&gt;&lt;/b&gt;&lt;br&gt;&lt;b&gt;When will You Ever Need This?&lt;/b&gt;&lt;br&gt;If you have an Oracle database version prior to 11.1.0.7, Oracle Text is not able to index DOCX documents (as it does DOC documents). From version 11.1.0.7 and on, Oracle uses technology from Stellent, and DOCX is indexed as the other formats. So if you want to index DOCX text content in Oracle Text in a version prior to 11.1.0.7, then this could be a way to do it.&lt;br&gt;&lt;br&gt;Oracle is working on a back-port to 10.x, but I have no status when (if) this will be available. Microsoft Office 2007 has been around since.. Take a wild guess! So these things obviously takes some time.&lt;br&gt;&lt;br&gt;&lt;b&gt;About Microsoft Open Office XML Format&lt;/b&gt;&lt;br&gt;As seen from the eyes of a PL/SQL developer, that is. First of all, XML sounds promising, you can do a ton of things with a valid XML in an Oracle database. You get the first nasty surprise when opening a DOCX-document in your favorite text editor; it is a zip archive! The next is when you realize that utl_compress can't help you uncompressing it either.&lt;br&gt;&lt;br&gt;So Google next, and realizing this cannot be easily done in a pure PL/SQL solution, Google yields &lt;a href="http://www.infoq.com/articles/cracking-office-2007-with-java"&gt;this gem from Ted Neward&lt;/a&gt;. It is a DOCX (Open XML) walk through as seen from the eyes of a Java developer. Very educational.&lt;br&gt;&lt;br&gt;&lt;b&gt;How to Unzip in PL/SQL&lt;/b&gt;&lt;br&gt;You probably can, but that would probably also involve a lot of work. The easy way is to take hold of a Java method that already does what you want. After searching the net I came up with &lt;a href="http://www.oooforum.org/forum/viewtopic.phtml?t=24711"&gt;this post from peterv6i&lt;/a&gt; which does exactly what I want (and more, it can also add files (BLOB) to an existing zip archive).&lt;br&gt;&lt;br&gt;My short version of this (as I only need to extract content), follows below. The script creates a java class with a method to extract a file from a zip archive, and a PL/SQL wrapper to the getFileFromZip method. The database user must have JAVA_DEPLOY and JAVAUSERPRIV (I think) roles.&lt;br&gt;&lt;pre&gt;create or replace java source named "ZIPImpl" &lt;br&gt;AS &lt;br&gt;import java.io.*; &lt;br&gt;import java.util.zip.*; &lt;br&gt;import java.sql.*; &lt;br&gt;import oracle.sql.*; &lt;br&gt;public class ZIPImpl &lt;br&gt;{ &lt;br&gt;public static void getFileFromZip(oracle.sql.BLOB srcBlob, oracle.sql.BLOB dstBlob[], java.lang.String name) { &lt;br&gt;try { &lt;br&gt;   OutputStream outBuffer = dstBlob[0].getBinaryOutputStream(); &lt;br&gt;   InputStream inBuffer = srcBlob.getBinaryStream(); &lt;br&gt;   ZipInputStream zip = new ZipInputStream(inBuffer); &lt;br&gt;   ZipEntry entry; &lt;br&gt;   byte[] tmpBuffer = new byte[2048]; &lt;br&gt;   while((entry = zip.getNextEntry()) != null) { &lt;br&gt;      if (entry.getName().compareTo(name)==0) { &lt;br&gt;         int n; &lt;br&gt;         while ((n = zip.read(tmpBuffer)) &amp;gt;= 0) &lt;br&gt;           outBuffer.write(tmpBuffer, 0, n); &lt;br&gt;      } &lt;br&gt;   } &lt;br&gt;   outBuffer.close(); &lt;br&gt; } &lt;br&gt; catch (SQLException e) { &lt;br&gt;   System.err.println(e); &lt;br&gt; } &lt;br&gt; catch (IOException e) { &lt;br&gt;   System.err.println(e); &lt;br&gt; } &lt;br&gt;} &lt;br&gt;}; &lt;br&gt;/&lt;br&gt;&lt;br&gt;alter java source "ZIPImpl" compile &lt;br&gt;/      &lt;br&gt;&lt;br&gt;create or replace package zip as &lt;br&gt;   procedure unzip( &lt;br&gt;      p_src       in          blob&lt;br&gt;   ,  p_dst       in out      blob&lt;br&gt;   ,  p_filename  in          varchar2); &lt;br&gt;end; &lt;br&gt;/&lt;br&gt;&lt;br&gt;create or replace package body zip as &lt;br&gt;   procedure unzip( &lt;br&gt;      p_src       in          blob&lt;br&gt;   ,  p_dst       in out      blob&lt;br&gt;   ,  p_filename  in          varchar2) &lt;br&gt;   as language java &lt;br&gt;   name 'ZIPImpl.getFileFromZip(oracle.sql.BLOB, oracle.sql.BLOB[], java.lang.String)'; &lt;br&gt;end; &lt;br&gt;/ &lt;br&gt;&lt;/pre&gt;&lt;b&gt;How to Extract Plain Text Content from DOCX&lt;/b&gt;&lt;br&gt;So, now you have a procedure to extract a file from a zip archive, next is to attack the content of the file. The DOCX file consists of several files, but the text content of the document resides in "word/document.xml". As the file is an XML document, I will perform an XML/XSL transformation of the file to be left with only plain text.&lt;br&gt;&lt;br&gt;The script below creates a table SAMPLES_DOCX which will hold the original DOCX file stored as a BLOB, and a CLOB containing the plain text. It also creates a package with three procedures:&lt;br&gt;&lt;ul&gt;&lt;li&gt;Store the DOCX (as uploaded into APEX_APPLICATION_FILES)&lt;/li&gt;&lt;li&gt;Download the original file (strictly not necessary for this exercise, but nice to have all the same)&lt;/li&gt;&lt;li&gt;Extract and store plain text from DOCX&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;The XSL used to transform the document.xml file is an (extremely) abbreviated version of the XSL &lt;a href="http://forums.oracle.com/forums/thread.jspa?messageID=3368284"&gt;posted here in the Oracle Technical Forums&lt;/a&gt;.&lt;br&gt;&lt;pre&gt;create table samples_docx (&lt;br&gt;   filename       varchar2(255) not null&lt;br&gt;,  mime_type      varchar2(255)&lt;br&gt;,  orig_file      blob&lt;br&gt;,  text_content   clob)&lt;br&gt;/&lt;br&gt;&lt;br&gt;alter table samples_docx add constraint samples_docx_pk primary key (filename)&lt;br&gt;/&lt;br&gt;&lt;br&gt;create or replace package sample_docx_p as&lt;br&gt;   -- get file from apex_application_files and store it in samples_docx table&lt;br&gt;   procedure store_docx (&lt;br&gt;      p_file_name    in       varchar2);&lt;br&gt;   -- download procedure for original docx file&lt;br&gt;   procedure retrieve_docx (&lt;br&gt;      p_file_name    in       varchar2);&lt;br&gt;   -- extract plain text from docx file (this is the meat)&lt;br&gt;   procedure store_text (&lt;br&gt;      p_file_name    in       varchar2);&lt;br&gt;end;&lt;br&gt;/&lt;br&gt;&lt;br&gt;create or replace package body sample_docx_p as&lt;br&gt;   -- get file from apex_application_files and store it in samples_docx table&lt;br&gt;   procedure store_docx (&lt;br&gt;      p_file_name    in       varchar2)&lt;br&gt;   is&lt;br&gt;      l_file         blob;&lt;br&gt;      l_mime_type    apex_application_files.mime_type%type;&lt;br&gt;      l_name         apex_application_files.name%type;&lt;br&gt;   begin&lt;br&gt;      -- get file from apex files&lt;br&gt;      select  name&lt;br&gt;            , mime_type&lt;br&gt;            , blob_content&lt;br&gt;       into   l_name&lt;br&gt;            , l_mime_type&lt;br&gt;            , l_file&lt;br&gt;       from   apex_application_files&lt;br&gt;      where   name = p_file_name;&lt;br&gt;      -- insert record into samples table&lt;br&gt;      insert into samples_docx ( filename&lt;br&gt;                               , mime_type&lt;br&gt;                               , orig_file)&lt;br&gt;       values   (   l_name&lt;br&gt;                  , l_mime_type&lt;br&gt;                  , l_file);&lt;br&gt;      -- delete file from apex files when done&lt;br&gt;      delete from   apex_application_files&lt;br&gt;           where   name = p_file_name;&lt;br&gt;   end store_docx;&lt;br&gt;   -- download procedure for original docx file&lt;br&gt;   procedure retrieve_docx (&lt;br&gt;      p_file_name    in       varchar2)&lt;br&gt;   is&lt;br&gt;      l_file         blob;&lt;br&gt;      l_mime_type    apex_application_files.mime_type%type;&lt;br&gt;      l_name         apex_application_files.name%type;&lt;br&gt;      l_size         number;&lt;br&gt;   begin&lt;br&gt;      -- get file from apex files&lt;br&gt;      select  filename&lt;br&gt;            , mime_type&lt;br&gt;            , orig_file&lt;br&gt;            , dbms_lob.getlength(orig_file)&lt;br&gt;       into   l_name&lt;br&gt;            , l_mime_type&lt;br&gt;            , l_file&lt;br&gt;            , l_size&lt;br&gt;       from samples_docx   &lt;br&gt;      where   filename = p_file_name;&lt;br&gt;      -- return file&lt;br&gt;      owa_util.mime_header( nvl(l_mime_type,'application/octet'), false);&lt;br&gt;      htp.p('Content-length: ' || l_size);&lt;br&gt;      htp.p('Content-Disposition:  attachment; filename="'||replace(replace(substr(l_name,instr(l_name,'/')+1),chr(10),null),chr(13),null)|| '"');&lt;br&gt;      owa_util.http_header_close;&lt;br&gt;      wpg_docload.download_file(l_file);&lt;br&gt;   end retrieve_docx;&lt;br&gt;   -- perform xsl tranformation of document.xml&lt;br&gt;   function get_text (&lt;br&gt;      p_docx_xml     in       xmltype&lt;br&gt;   ) return clob&lt;br&gt;   is&lt;br&gt;   l_clob   clob;&lt;br&gt;   -- xsl monkeyed from http://forums.oracle.com/forums/thread.jspa?messageID=3368284&lt;br&gt;   -- abbreviated quite a bit, check out original posting by "user304344" for the original&lt;br&gt;   l_xsl    xmltype := xmltype(&amp;#39;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&amp;#39;&lt;br&gt;                     ||chr(10)||&amp;#39;&amp;lt;xsl:stylesheet version=&amp;quot;1.0&amp;quot; xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot; &amp;#39;&lt;br&gt;                     ||chr(10)||'xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"'&lt;br&gt;                     ||chr(10)||'xmlns:v="urn:schemas-microsoft-com:vml"'&lt;br&gt;                     ||chr(10)||&amp;#39;exclude-result-prefixes=&amp;quot;w v&amp;quot;&amp;gt;&amp;#39;&lt;br&gt;                     ||chr(10)||&amp;#39;&amp;lt;xsl:output method=&amp;quot;text&amp;quot; indent=&amp;quot;no&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; version=&amp;quot;1.0&amp;quot;/&amp;gt;&amp;#39;&lt;br&gt;                     ||chr(10)||&amp;#39;&amp;lt;!-- document root --&amp;gt;&amp;#39;&lt;br&gt;                     ||chr(10)||&amp;#39;&amp;lt;xsl:template match=&amp;quot;/&amp;quot;&amp;gt;&amp;#39;&lt;br&gt;                     ||chr(10)||&amp;#39;&amp;lt;!-- root element in document --&amp;gt; &amp;#39;&lt;br&gt;                     ||chr(10)||&amp;#39;&amp;lt;xsl:apply-templates select=&amp;quot;w:document&amp;quot;/&amp;gt; &amp;#39;&lt;br&gt;                     ||chr(10)||&amp;#39;&amp;lt;/xsl:template&amp;gt;&amp;#39;&lt;br&gt;                     ||chr(10)||&amp;#39;&amp;lt;!-- ****************************start document**************************** --&amp;gt;&amp;#39;&lt;br&gt;                     ||chr(10)||&amp;#39;&amp;lt;xsl:template match=&amp;quot;w:document&amp;quot;&amp;gt;&amp;#39;&lt;br&gt;                     ||chr(10)||&amp;#39;&amp;lt;xsl:for-each select=&amp;quot;//w:p&amp;quot;&amp;gt;&amp;#39;&lt;br&gt;                     ||chr(10)||&amp;#39;&amp;lt;xsl:apply-templates select=&amp;quot;*/w:t&amp;quot;/&amp;gt; &amp;#39;&lt;br&gt;                     ||chr(10)||&amp;#39;&amp;lt;xsl:text&amp;gt;|¤¤&amp;lt;/xsl:text&amp;gt; &amp;#39;&lt;br&gt;                     ||chr(10)||&amp;#39;&amp;lt;/xsl:for-each&amp;gt; &amp;#39;&lt;br&gt;                     ||chr(10)||&amp;#39;&amp;lt;/xsl:template&amp;gt;&amp;#39;&lt;br&gt;                     ||chr(10)||&amp;#39;&amp;lt;!-- get all text nodes within a para --&amp;gt;&amp;#39;&lt;br&gt;                     ||chr(10)||&amp;#39;&amp;lt;xsl:template match=&amp;quot;*/w:t&amp;quot;&amp;gt;&amp;#39;&lt;br&gt;                     ||chr(10)||&amp;#39;&amp;lt;xsl:value-of select=&amp;quot;.&amp;quot;/&amp;gt;&amp;#39;&lt;br&gt;                     ||chr(10)||&amp;#39;&amp;lt;/xsl:template&amp;gt;&amp;#39;&lt;br&gt;                     ||chr(10)||&amp;#39;&amp;lt;!-- **************************** end document**************************** --&amp;gt;&amp;#39;&lt;br&gt;                     ||chr(10)||&amp;#39;&amp;lt;/xsl:stylesheet&amp;gt;&amp;#39;);&lt;br&gt;   begin&lt;br&gt;      -- "|¤¤" is just a hack to get linebreaks, should be an easier way to achieve this&lt;br&gt;      select replace(xmltransform(p_docx_xml, l_xsl).GetClobVal(), '|¤¤', chr(10))&lt;br&gt;        into l_clob&lt;br&gt;        from dual;&lt;br&gt;      return l_clob;&lt;br&gt;   end;   &lt;br&gt;   -- extract plain text from docx file (this is the meat)&lt;br&gt;   procedure store_text (&lt;br&gt;      p_file_name    in       varchar2)&lt;br&gt;   is&lt;br&gt;      l_docx            blob;&lt;br&gt;      l_docx_unzip      blob;&lt;br&gt;      l_doc             clob;&lt;br&gt;      l_dest_offset     integer := 1;&lt;br&gt;      l_src_offset      integer := 1;&lt;br&gt;      l_lang_context    integer := dbms_lob.default_lang_ctx;&lt;br&gt;      l_warning         integer;&lt;br&gt;   begin&lt;br&gt;      -- get original file&lt;br&gt;      select orig_file&lt;br&gt;        into l_docx&lt;br&gt;        from samples_docx&lt;br&gt;       where filename = p_file_name;&lt;br&gt;      -- create lob locators&lt;br&gt;      dbms_lob.createtemporary(l_docx_unzip,false);&lt;br&gt;      dbms_lob.createtemporary(l_doc,false);&lt;br&gt;      -- use java to unzip the docx file and retrieve document.xml&lt;br&gt;      zip.unzip(l_docx, l_docx_unzip, 'word/document.xml');&lt;br&gt;      -- convert blob to clob&lt;br&gt;      dbms_lob.converttoclob&lt;br&gt;               ( dest_lob =&amp;gt; l_doc&lt;br&gt;               , src_blob =&amp;gt; l_docx_unzip&lt;br&gt;               , amount =&amp;gt; dbms_lob.lobmaxsize&lt;br&gt;               , dest_offset =&amp;gt; l_dest_offset&lt;br&gt;               , src_offset =&amp;gt; l_src_offset&lt;br&gt;               , blob_csid =&amp;gt; nls_charset_id(&amp;#39;AL32UTF8&amp;#39;) --in my case, it is stored as UTF8&lt;br&gt;               , lang_context =&amp;gt; l_lang_context&lt;br&gt;               , warning =&amp;gt; l_warning&lt;br&gt;               );&lt;br&gt;      -- transform clob via xsl to get clean text&lt;br&gt;      l_doc := get_text(xmltype(l_doc));&lt;br&gt;      -- update the column containing document text&lt;br&gt;      update samples_docx&lt;br&gt;         set text_content = l_doc&lt;br&gt;       where filename = p_file_name;&lt;br&gt;      -- clean lob locators, should be repeated in exception block&lt;br&gt;      dbms_lob.freetemporary(l_docx_unzip);&lt;br&gt;      dbms_lob.freetemporary(l_doc);&lt;br&gt;   end;&lt;br&gt;end;&lt;br&gt;/&lt;br&gt;&lt;/pre&gt;&lt;b&gt;Bringing it Together in Oracle APEX&lt;/b&gt;&lt;br&gt;To test the code, you can create a simple upload page in APEX:&lt;br&gt;&lt;ul&gt;&lt;li&gt;Create new page&lt;/li&gt;&lt;li&gt;Form&lt;/li&gt;&lt;li&gt;Form on a procedure&lt;/li&gt;&lt;li&gt;&amp;lt;schema name&amp;gt; where you installed the application&lt;/li&gt;&lt;li&gt;Choose "sample_docx_p.store_docx" as stored procedure name&lt;/li&gt;&lt;li&gt;Accept defaults (or change to your liking)&lt;/li&gt;&lt;li&gt;Choose desired tab options&lt;/li&gt;&lt;li&gt;Leave Invoking Page/Button Label blank if you do not want an invoking page&lt;/li&gt;&lt;li&gt;Choose branch pages (can be the same as the one you are creating)&lt;/li&gt;&lt;li&gt;Accept defaults&lt;/li&gt;&lt;li&gt;Click Finish&lt;/li&gt;&lt;li&gt;Click Edit Page&lt;/li&gt;&lt;li&gt;Choose PXX_FILE_NAME, and change "Display as" from "Text item" to "File Browse..."&lt;/li&gt;&lt;li&gt;Apply changes&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;To add post processing to extract DOCX file content:&lt;br&gt;&lt;ul&gt;&lt;li&gt;Click Create under Processes&lt;/li&gt;&lt;li&gt;Choose PL/SQL&lt;/li&gt;&lt;li&gt;Give the process a name like "extract_text"&lt;/li&gt;&lt;li&gt;In the "Enter PL/SQL Page Process" dialog, paste "sample_docx_p.store_text(:PXX_FILE_NAME);" (XX being your page number)&lt;/li&gt;&lt;li&gt;Create process (and ensure the process comes after "Run Stored Procedure" process created by the page wizard&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;The last process could be implemented as a trigger on the samples_docx table.&lt;br&gt;&lt;br&gt;Run the page and test by uploading a DOCX document (or test it in my demo application).&lt;br&gt;&lt;br&gt;&lt;b&gt;Building More&lt;/b&gt;&lt;br&gt;If you have a need to manipulate DOCX documents, this could probably be achieved by using the complete "ZIPImpl" as posted in &lt;a href="http://www.oooforum.org/forum/viewtopic.phtml?t=24711"&gt;this article&lt;/a&gt;, and using substitution variables in the same manner as I have described with RTF documents in an earlier post.&lt;br&gt;&lt;br&gt;The zip/unzip may also come in handy when handling other office files (like Open Office ODF).&lt;br&gt;&lt;br&gt;This is only a proof of concept, and the code is not production ready. Really! I'm not just saying that out of habit.&lt;br&gt;&lt;br&gt;The next (and final) part of the DOCX "series" will address how to index the plain text content using Oracle Text.&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/8575920265455783910-396674855393371105?l=monkeyonoracle.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/orana_apex/~4/LWgQ-y4a6oA" height="1" width="1"/&gt;</description><feedburner:origLink>http://monkeyonoracle.blogspot.com/2010/03/docx-part-i-how-to-extract-document.html</feedburner:origLink></item><item><title>Oracle APEX 4.0: Cascading LOVs/Select Lists</title><link>http://feedproxy.google.com/~r/orana_apex/~3/vSKPugJVP1s/</link><category>APEX 4.0</category><category>cascading lov</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Patrick Wolf</dc:creator><pubDate>Sat, 27 Feb 2010 12:20:26 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/4b5ba5fe40917ce2</guid><description>&lt;p&gt;&lt;a title="Permanent Link to Oracle APEX 4.0: Cascading LOVs/Select Lists" href="http://www.inside-oracle-apex.com/oracle-apex-4-0-cascading-lovsselect-lists/" rel="bookmark"&gt;&lt;img src="http://www.inside-oracle-apex.com/blog/wp-content/uploads/cascading_lovs.png" alt="Oracle APEX 4.0: Cascading LOVs/Select Lists"&gt;&lt;/a&gt;&lt;/p&gt;
            		        One of the new features of Early Adopter 2 are Cascading LOVs/Select Lists. I’m pretty sure that almost every APEX developer had already the  requirement to refresh a child select list when a parent select list was changed. For example you pick a department in the first select list and the second should just [...]&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/InsideApex?a=UMF6lD4Kw4I:qIeKnGASQ18:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/InsideApex?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/InsideApex?a=UMF6lD4Kw4I:qIeKnGASQ18:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/InsideApex?i=UMF6lD4Kw4I:qIeKnGASQ18:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/InsideApex?a=UMF6lD4Kw4I:qIeKnGASQ18:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/InsideApex?i=UMF6lD4Kw4I:qIeKnGASQ18:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/InsideApex?a=UMF6lD4Kw4I:qIeKnGASQ18:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/InsideApex?d=7Q72WNTAKBA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/InsideApex?a=UMF6lD4Kw4I:qIeKnGASQ18:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/InsideApex?d=qj6IDK7rITs" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InsideApex/~4/UMF6lD4Kw4I" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/orana_apex/~4/vSKPugJVP1s" height="1" width="1"/&gt;</description><feedburner:origLink>http://feedproxy.google.com/~r/InsideApex/~3/UMF6lD4Kw4I/</feedburner:origLink></item><item><title>Oracle Application Express 4.0 EA2 live</title><link>http://feedproxy.google.com/~r/orana_apex/~3/UIm6JLCarNY/oracle-application-express-40-ea2-live.html</link><category>apex 4 ea2</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dimitri Gielis</dc:creator><pubDate>Sat, 27 Feb 2010 04:08:09 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/3027c8df54f8030e</guid><description>A few hours after my previous post, APEX 4.0 EA2 hit the air.&lt;br&gt;&lt;br&gt;The url to this new version of APEX 4.0 is still the same: &lt;a href="http://tryapexnow.com/apex/"&gt;http://tryapexnow.com/apex/&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://1.bp.blogspot.com/_tffIKLFlRlY/S4kKvGstrGI/AAAAAAAAFj0/U_bmviWonL0/s1600-h/Screen+shot+2010-02-27+at+13.00.48.png"&gt;&lt;img style="display:block;margin:0px auto 10px;text-align:center;width:400px;height:272px" src="http://1.bp.blogspot.com/_tffIKLFlRlY/S4kKvGstrGI/AAAAAAAAFj0/U_bmviWonL0/s400/Screen+shot+2010-02-27+at+13.00.48.png" alt="" border="0"&gt;&lt;/a&gt;&lt;br&gt;I'll start some proper testing next week, but if you already want to read what is changed, you find more information on &lt;a href="http://joelkallman.blogspot.com/2010/02/application-express-40-early-adopter.html"&gt;Joel Kallman&lt;/a&gt;'s post.&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/21122514-8328685769047910438?l=dgielis.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/orana_apex/~4/UIm6JLCarNY" height="1" width="1"/&gt;</description><feedburner:origLink>http://dgielis.blogspot.com/2010/02/oracle-application-express-40-ea2-live.html</feedburner:origLink></item><item><title>Application Express 4.0 - Early Adopter 2 Now Available</title><link>http://feedproxy.google.com/~r/orana_apex/~3/iP5EEeKxntI/</link><category>APEX 4.0</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">John Scott</dc:creator><pubDate>Fri, 26 Feb 2010 15:53:27 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/7a94c5bcaedf054a</guid><description>If you didn’t already see the news, the EA2 release of APEX4.0 has just been opened up.
Head over to www.tryapexnow.com, sign up for a workspace and try out all the cool new features.
EA2 includes the following key features -

Websheets (this will be huge!)
 New collection enhancements
 Tree region
 Debugging has been rewritten

and many more (see [...]&lt;img src="http://feeds.feedburner.com/~r/orana_apex/~4/iP5EEeKxntI" height="1" width="1"/&gt;</description><feedburner:origLink>http://jes.blogs.shellprompt.net/2010/02/27/application-express-40-early-adopter-2-now-available/</feedburner:origLink></item><item><title>Oracle APEX 4.0 Early Adopter Release 2 available!</title><link>http://feedproxy.google.com/~r/orana_apex/~3/rLtX8yXvnss/</link><category>News</category><category>beta</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Patrick Wolf</dc:creator><pubDate>Fri, 26 Feb 2010 14:15:14 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/ad884d2d7b1d2f7b</guid><description>&lt;p&gt;&lt;a title="Permanent Link to Oracle APEX 4.0 Early Adopter Release 2 available!" href="http://www.inside-oracle-apex.com/oracle-apex-4-0-early-adopter-release-2-available/" rel="bookmark"&gt;&lt;img src="http://www.inside-oracle-apex.com/blog/wp-content/uploads/ea2.gif" alt="Oracle APEX 4.0 Early Adopter Release 2 available!"&gt;&lt;/a&gt;&lt;/p&gt;
            		        Tryapexnow.com has just been updated to our new Oracle APEX 4.0 Early Adopter Release 2. Have a look, there are many new features, like WebSheets for example. A detailed list will be made available on Monday. I have also updated my plug-in example application with new plug-ins. Tutorials will follow soon. You can check it [...]&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/InsideApex?a=xAKGZQhYTNQ:MT9YCoChvno:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/InsideApex?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/InsideApex?a=xAKGZQhYTNQ:MT9YCoChvno:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/InsideApex?i=xAKGZQhYTNQ:MT9YCoChvno:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/InsideApex?a=xAKGZQhYTNQ:MT9YCoChvno:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/InsideApex?i=xAKGZQhYTNQ:MT9YCoChvno:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/InsideApex?a=xAKGZQhYTNQ:MT9YCoChvno:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/InsideApex?d=7Q72WNTAKBA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/InsideApex?a=xAKGZQhYTNQ:MT9YCoChvno:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/InsideApex?d=qj6IDK7rITs" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InsideApex/~4/xAKGZQhYTNQ" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/orana_apex/~4/rLtX8yXvnss" height="1" width="1"/&gt;</description><feedburner:origLink>http://feedproxy.google.com/~r/InsideApex/~3/xAKGZQhYTNQ/</feedburner:origLink></item><item><title>Apex EA2 update</title><link>http://feedproxy.google.com/~r/orana_apex/~3/VyxdY0eJPG0/apex-ea2-update.html</link><category>apexblogs</category><category>apex</category><category>apex4</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paul Brookes</dc:creator><pubDate>Fri, 26 Feb 2010 14:23:14 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/5980c1a3db1d9d5b</guid><description>To see the new style Plugins use this link to the Plugins Application provided by &lt;a href="http://www.inside-oracle-apex.com/"&gt;Patrick Wolf:&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://tryapexnow.com/apex/f?p=888:1:4073611300833285"&gt;Plugins Application&lt;/a&gt;&lt;br&gt;&lt;br&gt;I've managed to copy the syntax used in some of these plugins to update those on my &lt;a href="http://tryapexnow.com/apex/f?p=ONLINESTORE"&gt;Online Store &lt;/a&gt;demo. &lt;br&gt;&lt;br&gt;I&amp;#39;ve still need to upload some images and it looks like there are a few issue with my schema, but generally the app appears to be working.  So, in general it looks like EA1 apps can be imported into EA2 with little need to change anything.&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/7009865144978602832-3982370879287483253?l=peekbee.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/orana_apex/~4/VyxdY0eJPG0" height="1" width="1"/&gt;</description><feedburner:origLink>http://peekbee.blogspot.com/2010/02/apex-ea2-update.html</feedburner:origLink></item><item><title>Application Express 4.0 Early Adopter Phase II is available</title><link>http://feedproxy.google.com/~r/orana_apex/~3/KlB6tGQfKL8/application-express-40-early-adopter.html</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Joel R. Kallman</dc:creator><pubDate>Fri, 26 Feb 2010 13:45:26 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/7e08be1c1a363e84</guid><description>The second phase of the Application Express 4.0 Early Adopter is now available.  A new instance with the latest build of Application Express 4.0 is now available on &lt;a href="http://tryapexnow.com"&gt;http://tryapexnow.com&lt;/a&gt;.&lt;br&gt;&lt;br&gt;&lt;ol&gt;&lt;li&gt;This database was created with database character set AL32UTF8 (we're still a little confused by the Amazon Machine Images from Oracle aren't already AL32UTF8.&lt;/li&gt;&lt;li&gt;The Websheets feature is now available.  The security of Websheet applications still needs to be refined, but the functionality and ease of creation of these types of applications is amazing.&lt;/li&gt;&lt;li&gt;The new tree region makes its debut.&lt;/li&gt;&lt;li&gt;Collections now support NUMBER and DATE&lt;/li&gt;&lt;li&gt;apex_collection.create_collection_from_query_b and apex_collection.create_collection_from_queryb2 support bind variables and row limits&lt;/li&gt;&lt;li&gt;Debugging and logging has been completely rewritten - no longer is debug output emitted within the page, but it's collected and can be viewed later (and also queried via views).&lt;/li&gt;&lt;li&gt;You won't be able to see this, but the tablespaces / data files of provisioned workspaces will now autoextend &lt;/li&gt;&lt;li&gt;There have been many improvements in the Plug-In infrastructure, which &lt;a href="http://www.inside-oracle-apex.com/"&gt;Patrick&lt;/a&gt; will surely expand upon.&lt;/li&gt;&lt;li&gt;A Migration Assistant has been created, which lets you upgrade all of the elements of your pre APEX 4.0 application in one place.&lt;/li&gt;&lt;li&gt;Native validations and declarative validations have also been rewritten and improved (again, &lt;a href="http://www.inside-oracle-apex.com/"&gt;Patrick&lt;/a&gt; will expand upon this).&lt;/li&gt;&lt;li&gt;All of the item types have been consolidated (so you no longer see 1,000 different Date Picker types in your item type select list, as well as other item types)&lt;/li&gt;&lt;li&gt;A large number of bugs and usability issues have been corrected, thanks  in a large part to the tremendous amount of feedback we received.&lt;br&gt;&lt;/li&gt;&lt;/ol&gt;This isn't an exhaustive list.  The updated list of new features will be available on tryapexnow.com.&lt;br&gt;&lt;br&gt;If you had used the first Application Express 4.0 Early Adopter instance, your workspace and schema have not been migrated to this instance.  You will need to sign up for a workspace but you shouldn't have to take the survey again.  The original Application Express 4.0 Early Adopter instance is available at &lt;a href="http://184.73.244.154/apex"&gt;http://184.73.244.154/apex&lt;/a&gt;, and it will be available for the next couple of weeks.&lt;br&gt;&lt;br&gt;Thanks to everyone who has participated and provided feedback, as the feedback and suggestions have been invaluable.&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/12214002-3898117195644824576?l=joelkallman.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/orana_apex/~4/KlB6tGQfKL8" height="1" width="1"/&gt;</description><gr:likingUser xmlns:gr="http://www.google.com/schemas/reader/atom/">14954292624007681939</gr:likingUser><gr:likingUser xmlns:gr="http://www.google.com/schemas/reader/atom/">00882243051820548797</gr:likingUser><feedburner:origLink>http://joelkallman.blogspot.com/2010/02/application-express-40-early-adopter.html</feedburner:origLink></item></channel></rss>
