<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-8884584404576003487</id><updated>2010-03-15T21:28:32.317-04:00</updated><title type='text'>ORACLENERD</title><subtitle type='html'></subtitle><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default'/><link rel='alternate' type='text/html' href='http://www.oraclenerd.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default?start-index=26&amp;max-results=25'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.oraclenerd.com/atom.xml'/><author><name>oraclenerd</name><uri>http://www.blogger.com/profile/12412013306950057961</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>476</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8884584404576003487.post-5364618486349366993</id><published>2010-03-14T18:07:00.005-04:00</published><updated>2010-03-14T18:42:53.136-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='funny'/><category scheme='http://www.blogger.com/atom/ns#' term='wtf'/><title type='text'>Afraid to COMMIT;</title><content type='html'>Going through some old documents, I found this little gem I had uncovered doing some analysis of the source code.&lt;br /&gt;&lt;br /&gt;I found this crazy enough to save, so I hope you enjoy it.&lt;br /&gt;&lt;br /&gt;I found 14 or 15 commits in a 115 line procedure.  I was shocked and stunned.  It was wrong on so many different levels.  I share with you the pain I went through.&lt;br /&gt;&lt;br /&gt;We'll start off with a call to the logging table (just a quick note, this was not a stored procedure but a INSERT statement).&lt;pre class="code"&gt;log_something;&lt;/pre&gt;Creating a record in the THIS_TABLE, it will have a status of A.  Everything in there has a status of A.&lt;pre class="code"&gt;INSERT INTO this_table (my_id, start_date) &lt;br /&gt;VALUES ( l_my_id, sysdate)&lt;br /&gt;RETURNING table_id INTO l_table_id;&lt;/pre&gt;I know some could argue for COMMITs being inside stored procedure, but it was hammered into my head at an early age that the calling application should perform the COMMIT.&lt;pre class="code"&gt;COMMIT;&lt;/pre&gt;THIS_TABLE had multiple "rules" tables.  I understood the concept, but the implementation was not so good.  This is the first "rules" table.&lt;pre class="code"&gt;UPDATE rule_tab&lt;br /&gt;  SET status = 'D'&lt;br /&gt;WHERE my_id = l_my_id&lt;br /&gt;  AND status = 'A';&lt;/pre&gt;Just so you are aware, that STATUS column had no constraint on it other than the size VARCHAR2(1).&lt;br /&gt;&lt;br /&gt;Guess what time it is?&lt;pre class="code"&gt;COMMIT;&lt;/pre&gt;Here is the second&lt;pre class="code"&gt;UPDATE other_rules_table&lt;br /&gt;  SET status='D'&lt;br /&gt;WHERE my_id = l_my_id&lt;br /&gt;  AND status='A';&lt;/pre&gt;Guess what?&lt;pre class="code"&gt;COMMIT;&lt;/pre&gt;OK...here comes the other awesome part...to switch the status back to A (Active), we're going to create a job...in 30 minutes&lt;pre class="code"&gt;dbms_job.submit&lt;br /&gt;  ( job =&gt; ln_jobno, &lt;br /&gt;    what =&gt; 'update rule_table set status=''A'' where my_id = '||l_my_id||' AND status = ''D'';', &lt;br /&gt;    next =&gt; sysdate+(.5/24));&lt;/pre&gt;&lt;pre class="code"&gt;COMMIT;&lt;/pre&gt;I kind of understand that one...for the job to go into the queue you have to issue the COMMIT.&lt;br /&gt;&lt;br /&gt;For some reason, it's now cool to use a nested block.&lt;pre class="code"&gt;BEGIN&lt;br /&gt;  dbms_job.submit&lt;br /&gt;    ( job =&gt; ln_jobno, &lt;br /&gt;      what =&gt; 'update other_rule_table set status=''A'' where my_id = '||l_my_id||' AND status = ''D'';', &lt;br /&gt;      next =&gt; sysdate+(.5/24) );&lt;br /&gt;&lt;br /&gt;  COMMIT;&lt;br /&gt;EXCEPTION&lt;br /&gt;  WHEN OTHERS THEN&lt;br /&gt;     insert into errors (name,error_date, text) &lt;br /&gt;     values ('it broke', sysdate, ' MY_ID '||l_my_id||' creating job  to set to a ');&lt;br /&gt;     COMMIT;&lt;br /&gt;END;&lt;/pre&gt;Now we have 2 jobs created, one to update THIS_TABLE and one to update my first "rules" table.  -10 for using DML in a job.  -10 for not putting them into a single job that could fail together.  -30 for not creating a stored procedure to do this.&lt;br /&gt;&lt;br /&gt;But wait, it's not over yet.  We're getting to the very best part I think.&lt;pre class="code"&gt;BEGIN&lt;br /&gt;  dbms_job.submit&lt;br /&gt;    ( job =&gt; ln_jobno, &lt;br /&gt;      what =&gt; 'insert into errors (name,error_date, text) &lt;br /&gt;                       values (''wow'', sysdate, ''error turning it back on') ;', &lt;br /&gt;      next =&gt; sysdate+(.5/24));&lt;br /&gt;&lt;br /&gt;EXCEPTION&lt;br /&gt;  WHEN others THEN&lt;br /&gt;      insert into errors (name,error_date, text) &lt;br /&gt;      values ('doing stuff', sysdate, ' MY_ID '||l_my_id||' creating job to log errors');&lt;br /&gt;&lt;br /&gt;    COMMIT;&lt;br /&gt;END;&lt;/pre&gt;Did I catch a "&lt;a href="http://www.imdb.com/title/tt0114694/quotes?qt0402663"&gt;niner&lt;/a&gt;" in there?  &lt;br /&gt;&lt;br /&gt;Did you catch what that final job did?  It "logged" an error from the previous 2 jobs.  Really?  Do jobs work like that?  I'm not really sure that they do.&lt;br /&gt;&lt;br /&gt;This little snippet is just a snapshot into my life over the last few years.  This kind of thing is everywhere.  (I know &lt;a href="http://www.oraclenerd.com/2008/12/tampa-timeline.html"&gt;everywhere&lt;/a&gt;!).  I've mentioned before, but I've been reading &lt;a href="http://thedailywtf.com/"&gt;The Daily WTF&lt;/a&gt; since 2005.  Daily.  I've learned more from that site than perhaps any other because you learn what &lt;i&gt;not&lt;/i&gt; to do...which is just as important as what &lt;i&gt;to&lt;/i&gt; do.  It takes years to gain the necessary experience (read:  screwing up) to know what not to do, The Daily WTF speeds that up significantly by allowing you to witness others mistakes.  We've all made them, to be sure.  It's whether we learn from them that is important.&lt;div class="blogger-post-footer"&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3853911845992923";/* atom feed */google_ad_slot = "1428191201";google_ad_width = 728;google_ad_height = 15;//--&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8884584404576003487-5364618486349366993?l=www.oraclenerd.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/5364618486349366993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8884584404576003487&amp;postID=5364618486349366993' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/5364618486349366993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/5364618486349366993'/><link rel='alternate' type='text/html' href='http://www.oraclenerd.com/2010/03/afraid-to-commit.html' title='Afraid to COMMIT;'/><author><name>oraclenerd</name><uri>http://www.blogger.com/profile/12412013306950057961</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03223434293565733241'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8884584404576003487.post-7386172181594358762</id><published>2010-03-10T13:34:00.002-05:00</published><updated>2010-03-10T13:39:23.418-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='moneill'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Everything is a Bit Bucket</title><content type='html'>By:  Michael O'Neill&lt;br /&gt;&lt;a href="http://twitter.com/oraclenude"&gt;@oraclenude&lt;/a&gt;&lt;br /&gt;&lt;a href="http://oraclenude.crisatunity.com"&gt;oraclenude.crisatunity.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In response to &lt;a href="http://www.oraclenerd.com/2010/03/database-is-bucket-mentality.html"&gt;Chet's frustration&lt;/a&gt; over yet another encounter with a database agnostic, I wanted to contribute my first article to the &lt;span class="oraclenerd"&gt;oraclenerd&lt;/span&gt; franchise.  My thoughts seemed too long for the comment stream.&lt;br /&gt;&lt;br /&gt;I ascribe the kernel of thought behind "the database is a bit bucket" primarily to each and every database vendor that ever existed.  Every database vendor, in an effort to persuade users of competitive products to adopt their product, has participated willingly in espousing some core aspect of how "same as the other guy" their product is in addition to whatever differentiation pitch they have.&lt;br /&gt;&lt;br /&gt;Now, the generally weak-minded and lazy developer (yes, I think the majority of developers are in fact weak-minded and lazy) latches on to the vendor's selective "sameness" claims for professional and personal reasons. (full disclosure: I am both an Oracle DBA and .NET developer)&lt;br /&gt;&lt;br /&gt;Professionally, because they are financially invested in writing third-party code not database code.  To them, the less they spend learning and understanding the particulars of things like databases, operating systems, networks, human beings, etc. the better. Personally, because there is a dominate thread in the culture of developers to dismiss the database as interesting or meaningful. It is a form of heresy to show affection towards any platform in any specificity.&lt;br /&gt;&lt;br /&gt;This is why Java's Big Lie of "write once, run any where" swoons so many.  Java's Big Lie is analogous to "the database is a bit bucket" by declaring that even the language of software code should be as absolutely interchangeable as possible - even at the expense of being cost-effective or useful. There is an unquestioned faith that decoupling everything from everything is a good thing.  This faith gives us code that is as far from the simplest thing that could work from the first moment writing the code is undertaken.  It is a faith I reject.  That's why I'm an &lt;span class="oraclenerd"&gt;ORACLENERD&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;P.S. I know oraclenude and oraclenerd is confusing. It's supposed to be.&lt;div class="blogger-post-footer"&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3853911845992923";/* atom feed */google_ad_slot = "1428191201";google_ad_width = 728;google_ad_height = 15;//--&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8884584404576003487-7386172181594358762?l=www.oraclenerd.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/7386172181594358762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8884584404576003487&amp;postID=7386172181594358762' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/7386172181594358762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/7386172181594358762'/><link rel='alternate' type='text/html' href='http://www.oraclenerd.com/2010/03/everything-is-bit-bucket.html' title='Everything is a Bit Bucket'/><author><name>oraclenerd</name><uri>http://www.blogger.com/profile/12412013306950057961</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03223434293565733241'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8884584404576003487.post-1177657924480438004</id><published>2010-03-10T01:23:00.003-05:00</published><updated>2010-03-10T01:34:17.939-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='apex_util'/><category scheme='http://www.blogger.com/atom/ns#' term='apex'/><title type='text'>APEX: Create and Parse Arrays</title><content type='html'>It's been awhile since I've been able to work with APEX extensively, so I am rusty.&lt;br /&gt;&lt;br /&gt;A question came up today whether we could get multiple values into a single variable (Item in APEX).&lt;br /&gt;&lt;br /&gt;Yes we can!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://download.oracle.com/docs/cd/E11882_01/appdev.112/e12510/apex_util.htm#CHDIEDJH"&gt;APEX_UTILS&lt;/a&gt;Need some data first:&lt;pre class="code"&gt;CREATE TABLE t ( some_text VARCHAR2(10) );&lt;br /&gt;&lt;br /&gt;INSERT INTO t ( some_text )&lt;br /&gt;SELECT dbms_random.string( 'a', 10 ) some_text&lt;br /&gt;FROM dual&lt;br /&gt;  CONNECT BY LEVEL &lt;= 5;&lt;br /&gt;&lt;br /&gt;CJUSTICE@TESTING&gt;SELECT * FROM t;&lt;br /&gt;&lt;br /&gt;SOME_TEXT&lt;br /&gt;----------&lt;br /&gt;thrFXviVWJ&lt;br /&gt;kpfGRRwctv&lt;br /&gt;EVxNrcmBHC&lt;br /&gt;gcBlHaKrLa&lt;br /&gt;irYduOZfkS&lt;/pre&gt;I want that table data to be in a single item. &lt;a href="http://download.oracle.com/docs/cd/E11882_01/appdev.112/e12510/apex_util.htm#CHDJBFHG"&gt;TABLE_TO_STRING&lt;/a&gt; is your function.&lt;pre class="code"&gt;VAR C VARCHAR2(100);&lt;br /&gt;&lt;br /&gt;DECLARE&lt;br /&gt;  l_table APEX_APPLICATION_GLOBAL.VC_ARR2;&lt;br /&gt;BEGIN&lt;br /&gt;  SELECT some_text&lt;br /&gt;  BULK COLLECT INTO l_table&lt;br /&gt;  FROM t;&lt;br /&gt;&lt;br /&gt;  :c := apex_util.table_to_string( p_table =&gt; l_table );&lt;br /&gt;END;&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;C&lt;br /&gt;-----------------------------------------------------------&lt;br /&gt;thrFXviVWJ:kpfGRRwctv:EVxNrcmBHC:gcBlHaKrLa:irYduOZfkS&lt;/pre&gt;Easy enough.  How about converting it back to a table?  &lt;a href="http://download.oracle.com/docs/cd/E11882_01/appdev.112/e12510/apex_util.htm#CHDFEEJD"&gt;STRING_TO_TABLE&lt;/a&gt; is your answer.&lt;pre class="code"&gt;DECLARE&lt;br /&gt;  l_table APEX_APPLICATION_GLOBAL.VC_ARR2;&lt;br /&gt;BEGIN&lt;br /&gt;  l_table := apex_util.string_to_table( p_string =&gt; :c );&lt;br /&gt;  &lt;br /&gt;  FOR i IN 1..l_table.COUNT LOOP&lt;br /&gt;    d( 'value ' || i || ':  ' || l_table(i) );&lt;br /&gt;  END LOOP;&lt;br /&gt;END;&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;value 1:  thrFXviVWJ&lt;br /&gt;value 2:  kpfGRRwctv&lt;br /&gt;value 3:  EVxNrcmBHC&lt;br /&gt;value 4:  gcBlHaKrLa&lt;br /&gt;value 5:  irYduOZfkS&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;/pre&gt;Done.&lt;div class="blogger-post-footer"&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3853911845992923";/* atom feed */google_ad_slot = "1428191201";google_ad_width = 728;google_ad_height = 15;//--&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8884584404576003487-1177657924480438004?l=www.oraclenerd.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/1177657924480438004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8884584404576003487&amp;postID=1177657924480438004' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/1177657924480438004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/1177657924480438004'/><link rel='alternate' type='text/html' href='http://www.oraclenerd.com/2010/03/apex-create-and-parse-arrays.html' title='APEX: Create and Parse Arrays'/><author><name>oraclenerd</name><uri>http://www.blogger.com/profile/12412013306950057961</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03223434293565733241'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8884584404576003487.post-2280532480489287618</id><published>2010-03-09T22:50:00.004-05:00</published><updated>2010-03-10T20:15:38.169-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>The "Database is a Bucket" Mentality</title><content type='html'>Front and center again...I just woke up from a nap, I'm grumpy, so I must write.  Besides, I haven't had a good rant in quite some time.&lt;br /&gt;&lt;br /&gt;Friend of mine asked me last week for some advice, specifically asking if there was a tool to convert Oracle SQL Syntax to the ANSI SQL syntax.  (A quick search turned up &lt;a href="http://www.swissql.com/products/sql-translator/sql-converter.html"&gt;this&lt;/a&gt; (it was the first result), if you're interested).&lt;br /&gt;&lt;br /&gt;I had to ask why.&lt;br /&gt;&lt;br /&gt;Client is switching to an open source database, i.e. "free."  Oracle licensing is way too pricey.&lt;br /&gt;&lt;br /&gt;I'm sure Oracle costs a lot of money, it's pretty darn good software.  Quite possibly the best in the world especially in the database realm.  I've written about the incredibly feature rich goodness that is the Oracle database &lt;a href="http://www.oraclenerd.com/2009/03/oracle-as-platform.html"&gt;here&lt;/a&gt; &lt;a href="http://www.oraclenerd.com/2008/05/apex-oracle-marketing-wtf.html"&gt;here&lt;/a&gt;...actually, just trust me.  It's in my name.&lt;br /&gt;&lt;br /&gt;Why is there even a comparison?&lt;br /&gt;&lt;br /&gt;Could it be that everyone out there believes that the sole purpose of a database is to store data?  That it can't do &lt;i&gt;anything&lt;/i&gt; else?  The storage and retrieval of data...that's all it does of course.&lt;br /&gt;&lt;br /&gt;It's like saying the Democrats and Republicans are the same...at face value, perhaps, but the devil is in the details.&lt;br /&gt;&lt;br /&gt;This, this "Bit Bucket" mentality is what is so incredibly frustrating.&lt;br /&gt;&lt;br /&gt;I am no position to argue the differences between the various flavors of database, I lack the experience.  But if I were using SQL Server, I would leverage the shit out of it's capabilities.  If I were using MySQL, I would leverage the shit out of it's capabilities.  If I were using Firebird, I would leverage the shit out of it's capabilities.  Same goes for every single flavor out there.  Get my point here?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The database is NOT a bit bucket!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Do I need to use more 4-letter words?&lt;br /&gt;&lt;br /&gt;I know that Oracle is feature rich and that 99% percent of your code can live in the database...think APEX and PL/SQL.  You could probably put ALL of your code inside the database if you wanted to put the javascript in BLOBs as well.&lt;br /&gt;&lt;br /&gt;Please, please please quit telling me they are the same...&lt;b&gt;&lt;i&gt;they are not&lt;/i&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Follow up rant by Mr. O'Neill can be found on this following post &lt;a href="http://www.oraclenerd.com/2010/03/everything-is-bit-bucket.html"&gt;Everything is a Bit Bucket&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3853911845992923";/* atom feed */google_ad_slot = "1428191201";google_ad_width = 728;google_ad_height = 15;//--&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8884584404576003487-2280532480489287618?l=www.oraclenerd.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/2280532480489287618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8884584404576003487&amp;postID=2280532480489287618' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/2280532480489287618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/2280532480489287618'/><link rel='alternate' type='text/html' href='http://www.oraclenerd.com/2010/03/database-is-bucket-mentality.html' title='The &quot;Database is a Bucket&quot; Mentality'/><author><name>oraclenerd</name><uri>http://www.blogger.com/profile/12412013306950057961</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03223434293565733241'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8884584404576003487.post-875349462869366795</id><published>2010-03-09T01:38:00.002-05:00</published><updated>2010-03-09T01:40:57.907-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='funny'/><category scheme='http://www.blogger.com/atom/ns#' term='wtf'/><category scheme='http://www.blogger.com/atom/ns#' term='style'/><title type='text'>Code Comment WTF?  Part 209</title><content type='html'>Found this in a snippet today:&lt;pre class="code"&gt;-- ********************************&lt;br /&gt;-- End of Package Body&lt;br /&gt;&lt;br /&gt;END package_pkg ;&lt;br /&gt;/&lt;/pre&gt;Seriously?  Was that necessary?  Could I possibly be under the illusion that it is &lt;i&gt;&lt;b&gt;not&lt;/b&gt;&lt;/i&gt; the end of the package?&lt;br /&gt;&lt;br /&gt;Stop it.&lt;br /&gt;&lt;br /&gt;Now.&lt;div class="blogger-post-footer"&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3853911845992923";/* atom feed */google_ad_slot = "1428191201";google_ad_width = 728;google_ad_height = 15;//--&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8884584404576003487-875349462869366795?l=www.oraclenerd.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/875349462869366795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8884584404576003487&amp;postID=875349462869366795' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/875349462869366795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/875349462869366795'/><link rel='alternate' type='text/html' href='http://www.oraclenerd.com/2010/03/code-comment-wtf-part-209.html' title='Code Comment WTF?  Part 209'/><author><name>oraclenerd</name><uri>http://www.blogger.com/profile/12412013306950057961</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03223434293565733241'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8884584404576003487.post-6066666730391546161</id><published>2010-03-09T01:09:00.004-05:00</published><updated>2010-03-09T02:10:10.870-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='apex'/><title type='text'>APEX: LDAP Authentication</title><content type='html'>I got called into a discussion about an existing APEX application.  The custom LDAP functionality wasn't working as they expected.&lt;br /&gt;&lt;br /&gt;I knew APEX had an LDAP authentication scheme (and don't know the full history of the project so I can't (won't) comment on why it wasn't used).  So I fired up my local sandbox just to see how easy or hard it was.  Admittedly, I have always avoided anything to do with LDAP...not sure why (plate is full?).  I used &lt;a href="http://www.oracle.com/technology/products/database/application_express/howtos/how_to_ldap_authenticate.html"&gt;this&lt;/a&gt; as a guide.&lt;br /&gt;&lt;br /&gt;Anyway, it was remarkably easy.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Setup&lt;/b&gt;&lt;br /&gt;APEX:  3.2.1&lt;br /&gt;Web Server: Apache (OHS)&lt;br /&gt;Database:&lt;pre class="code"&gt;BANNER&lt;br /&gt;----------------------------------------------------------------&lt;br /&gt;Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod&lt;br /&gt;PL/SQL Release 10.2.0.3.0 - Production&lt;br /&gt;CORE    10.2.0.3.0      Production&lt;br /&gt;TNS for 32-bit Windows: Version 10.2.0.3.0 - Production&lt;br /&gt;NLSRTL Version 10.2.0.3.0 - Production&lt;/pre&gt;First I fired up the web server:&lt;pre class="code"&gt;C:\oracle\http\opmn\bin&gt;opmnctl start&lt;br /&gt;opmnctl: opmn started&lt;br /&gt;&lt;br /&gt;C:\oracle\http\opmn\bin&gt;opmnctl startproc process-type=HTTP_Server&lt;br /&gt;opmnctl: starting opmn managed processes...&lt;/pre&gt;Opened up APEX, and created a new application.  For authentication schemes I chose "No Authentication."&lt;br /&gt;&lt;br /&gt;After I had created the application, I went into Shared Components --&gt; Authentication Schemes --&gt; Create&lt;br /&gt;&lt;br /&gt;Select the default and click Next&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_rhCtHYLiamQ/S5XpwjkAJuI/AAAAAAABYBY/DI4NcKLKliI/s800/01_apex.jpg" alt="step 1" /&gt;&lt;br /&gt;&lt;br /&gt;Select "Show Login Page and Use LDAP Directory Credentials" and click Next&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_rhCtHYLiamQ/S5Xpw3Sb09I/AAAAAAABYBg/dgj_vbP6oXQ/s800/02_apex.jpg" alt="step 2" /&gt;&lt;br /&gt;&lt;br /&gt;I've already done this so I'm selecting my current Login page, 11, click Next&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_rhCtHYLiamQ/S5XpxaM9ohI/AAAAAAABYBs/VLAcEqGvO8Q/s800/03_apex.jpg" alt="step 3" /&gt;&lt;br /&gt;&lt;br /&gt;Enter your LDAP Host and your DN:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_rhCtHYLiamQ/S5XpyOKAyzI/AAAAAAABYB0/mQwL8tCp-bU/s800/04_apex.jpg" alt="step 4" /&gt;&lt;br /&gt;&lt;br /&gt;Your DN String should look something like this (from article above):&lt;pre class="code"&gt;cn=%LDAP_USER%,l=amer,dc=oracle,dc=com&lt;/pre&gt;Make sure you use the %LDAP_USER% after the cn= portion of the string.&lt;br /&gt;&lt;br /&gt;Name it ldap_test, click Create Scheme:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_rhCtHYLiamQ/S5XpyK36NiI/AAAAAAABYB8/Vg_F41wOt-M/s800/05_apex.jpg" alt="step 5" /&gt;&lt;br /&gt;&lt;br /&gt;You will then be redirected back to the list of Authentication Schemes, ldap_test should now be current&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/_rhCtHYLiamQ/S5XpyX-ij8I/AAAAAAABYCE/Z1srVL3ZSIg/s800/06_apex.jpg" alt="Fini!" /&gt;&lt;br /&gt;&lt;br /&gt;To test it just run your application and login using your LDAP (AD) credentials&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/_rhCtHYLiamQ/S5Xzp3AAZvI/AAAAAAABYDs/y1-5r3zbwCE/s800/08_apex_login.jpg" alt="login" /&gt;&lt;br /&gt;&lt;br /&gt;Success!&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_rhCtHYLiamQ/S5XzqKOEovI/AAAAAAABYD4/kismnUwQUwA/s800/09_success.jpg" alt="success!!" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3853911845992923";/* atom feed */google_ad_slot = "1428191201";google_ad_width = 728;google_ad_height = 15;//--&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8884584404576003487-6066666730391546161?l=www.oraclenerd.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/6066666730391546161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8884584404576003487&amp;postID=6066666730391546161' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/6066666730391546161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/6066666730391546161'/><link rel='alternate' type='text/html' href='http://www.oraclenerd.com/2010/03/apex-ldap-authentication.html' title='APEX: LDAP Authentication'/><author><name>oraclenerd</name><uri>http://www.blogger.com/profile/12412013306950057961</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03223434293565733241'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_rhCtHYLiamQ/S5XpwjkAJuI/AAAAAAABYBY/DI4NcKLKliI/s72-c/01_apex.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8884584404576003487.post-7071407464105112840</id><published>2010-03-08T13:35:00.005-05:00</published><updated>2010-03-08T13:47:01.015-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random'/><title type='text'>February Top 10</title><content type='html'>As the name implies, it's the Top 10 for this past month.  Probably the biggest reason I am doing this is the EBS Install series has become a runaway success.  I've never had something become so popular so quickly...which of course tells me I'm no good and &lt;a href="http://www.oraclenerd.com/labels/jpiwowar.html"&gt;John Piwowar&lt;/a&gt; is the best ever.  :)  &lt;br /&gt;&lt;br /&gt;John deserves quite a bit of recognition so the more I can provide, the better.&lt;br /&gt;&lt;br /&gt;&lt;table width="80%"&gt;&lt;tr&gt;&lt;td&gt;Title&lt;/td&gt;&lt;td align='right'&gt;Pageviews&lt;/td&gt;&lt;td align='right'&gt;Unique Pageviews&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href='http://www.oraclenerd.com//2009/12/ebs-install-guide-part-1.html'&gt;EBS Install Guide - Part I&lt;/a&gt;&lt;/td&gt;&lt;td align='right'&gt;541&lt;/td&gt;&lt;td align='right'&gt;394&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href='http://www.oraclenerd.com//2009/01/learning-oracle-business-intelligence.html'&gt;Learn Oracle Business Intelligency (OBIEE)&lt;/a&gt;&lt;/td&gt;&lt;td align='right'&gt;444&lt;/td&gt;&lt;td align='right'&gt;337&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href='http://www.oraclenerd.com//2009/12/ebs-install-guide-part-2.html'&gt;EBS Install Guide - Part 2&lt;/a&gt;&lt;/td&gt;&lt;td align='right'&gt;347&lt;/td&gt;&lt;td align='right'&gt;262&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href='http://www.oraclenerd.com//2008/04/dbmscrypto-example.html'&gt;DBMS_CRYPTO: Example&lt;/a&gt;&lt;/td&gt;&lt;td align='right'&gt;339&lt;/td&gt;&lt;td align='right'&gt;295&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href='http://www.oraclenerd.com//2009/11/apex-install-321-on-11gr2.html'&gt;APEX: Install 3.2.1 on 11gR2&lt;/a&gt;&lt;/td&gt;&lt;td align='right'&gt;263&lt;/td&gt;&lt;td align='right'&gt;225&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href='http://www.oraclenerd.com//2009/12/ebs-install-part-3.html'&gt;EBS Install Guide - Part 3&lt;/a&gt;&lt;/td&gt;&lt;td align='right'&gt;253&lt;/td&gt;&lt;td align='right'&gt;202&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href='http://www.oraclenerd.com//labels/obiee.html'&gt;OBIEE Posts&lt;/a&gt;&lt;/td&gt;&lt;td align='right'&gt;243&lt;/td&gt;&lt;td align='right'&gt;215&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href='http://www.oraclenerd.com//2009/03/obiee-how-to-migrate-your-rpd.html'&gt;OBIEE:  How to Migrate Your rpd&lt;/a&gt;&lt;/td&gt;&lt;td align='right'&gt;234&lt;/td&gt;&lt;td align='right'&gt;183&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href='http://www.oraclenerd.com//2008/06/bulk-collect-and-forall.html'&gt;BULK COLLECT and FORALL&lt;/a&gt;&lt;/td&gt;&lt;td align='right'&gt;187&lt;/td&gt;&lt;td align='right'&gt;166&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3853911845992923";/* atom feed */google_ad_slot = "1428191201";google_ad_width = 728;google_ad_height = 15;//--&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8884584404576003487-7071407464105112840?l=www.oraclenerd.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/7071407464105112840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8884584404576003487&amp;postID=7071407464105112840' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/7071407464105112840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/7071407464105112840'/><link rel='alternate' type='text/html' href='http://www.oraclenerd.com/2010/03/february-top-10.html' title='February Top 10'/><author><name>oraclenerd</name><uri>http://www.blogger.com/profile/12412013306950057961</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03223434293565733241'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8884584404576003487.post-1648607024059314877</id><published>2010-03-08T08:41:00.003-05:00</published><updated>2010-03-08T08:53:56.805-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='sql developer'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>SQL Developer: Install Unit Testing Repository</title><content type='html'>Get the latest SQL Developer release &lt;a href="http://htmldb.oracle.com/pls/otn/f?p=42626:16"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'm not a big tools guy, I prefer SQL*Plus to anything else.  I especially don't like paying for tools (yes, the database is a tool and costs a &lt;i&gt;lot&lt;/i&gt; of money...I do realize the hypocrisy).&lt;br /&gt;&lt;br /&gt;After Syme Kutz's presentation at SOUG, I've been looking more closely at SQL Developer.  I've been using it (and JDeveloper) since they were both made freely available a few years ago.  Mostly for the schema browsing, looking around, importing and exporting data.  I do use it (SQL Developer) to write reports that I can share with the Business folks as well.&lt;br /&gt;&lt;br /&gt;Syme's presentation was primarily on Unit Testing (which I begged for).  First step to using Unit Testing is to install the repository, a set of tables the application uses to build and store tests and their results.&lt;br /&gt;&lt;br /&gt;You need to have version 2.1 or greater.&lt;br /&gt;&lt;br /&gt;First up, go to Tools --&gt; Unit Test --&gt; Select Current Repository&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_rhCtHYLiamQ/S5T5iACnbHI/AAAAAAABX8Q/PRHG3nhK0tw/s800/01_select_current_repo.jpg" alt="select repostory" /&gt;&lt;br /&gt;&lt;br /&gt;You'll be prompted to select a connection (i.e. database) to use&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh3.ggpht.com/_rhCtHYLiamQ/S5T5ijeAC-I/AAAAAAABX8Y/BJ65Ifqmq2c/s800/02_select_connection.jpg" alt="select connection" /&gt;&lt;br /&gt;&lt;br /&gt;Would you like to create one now?  Select Yes.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh3.ggpht.com/_rhCtHYLiamQ/S5T5i09LSQI/AAAAAAABX8g/d-D6P-JiPPY/s800/03_no_repository.jpg" alt="no repository found" /&gt;&lt;br /&gt;&lt;br /&gt;You're then told the the required roles do not exist, select OK.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/_rhCtHYLiamQ/S5T5jYDLUrI/AAAAAAABX8o/7vVyS0uqG_Y/s800/04_role_does_not_exist.jpg" alt="roles do not exist" /&gt;&lt;br /&gt;&lt;br /&gt;Confirm running SQL&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_rhCtHYLiamQ/S5T5j01Qu9I/AAAAAAABX8w/5b8Q3fdJXT4/s800/06_running_sql.jpg" alt="confirm sql" /&gt;&lt;br /&gt;&lt;br /&gt;Running...will take just a few seconds&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_rhCtHYLiamQ/S5T5kIOrxKI/AAAAAAABX84/yH5yMpu6BrM/s800/07_running.jpg" alt="running" /&gt;&lt;br /&gt;&lt;br /&gt;Success!&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/_rhCtHYLiamQ/S5T5kk0-riI/AAAAAAABX9A/C9bgbPfTcJc/s800/08_create_succeeded.jpg" alt="success!" /&gt;&lt;br /&gt;&lt;br /&gt;That's it.  Easy right?  Future posts will detail managing users and creating tests.&lt;div class="blogger-post-footer"&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3853911845992923";/* atom feed */google_ad_slot = "1428191201";google_ad_width = 728;google_ad_height = 15;//--&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8884584404576003487-1648607024059314877?l=www.oraclenerd.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/1648607024059314877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8884584404576003487&amp;postID=1648607024059314877' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/1648607024059314877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/1648607024059314877'/><link rel='alternate' type='text/html' href='http://www.oraclenerd.com/2010/03/sql-developer-install-unit-testing.html' title='SQL Developer: Install Unit Testing Repository'/><author><name>oraclenerd</name><uri>http://www.blogger.com/profile/12412013306950057961</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03223434293565733241'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_rhCtHYLiamQ/S5T5iACnbHI/AAAAAAABX8Q/PRHG3nhK0tw/s72-c/01_select_current_repo.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8884584404576003487.post-1634881255268046159</id><published>2010-03-07T16:31:00.003-05:00</published><updated>2010-03-07T16:59:14.089-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='obiee'/><category scheme='http://www.blogger.com/atom/ns#' term='answers'/><category scheme='http://www.blogger.com/atom/ns#' term='presentation'/><title type='text'>OBIEE: Default Answers Template?</title><content type='html'>After trying out the lazyweb method of search (aka &lt;a href="http://twitter.com"&gt;Twitter&lt;/a&gt;) and not getting much help, I resorted to help at the OTN &lt;a href="http://forums.oracle.com/forums/forum.jspa?forumID=378&amp;start=0"&gt;OBIEE&lt;/a&gt; Forum.  It's not Twitter's fault, I think this problem was a bit too complex to describe in 140 characters.&lt;br /&gt;&lt;br /&gt;Here's the &lt;a href="http://forums.oracle.com/forums/thread.jspa?threadID=1039176&amp;tstart=0"&gt;post&lt;/a&gt; on OTN.  I started to get nervous too, I posted on Friday and hadn't had a response...until today.  3 days?  Man...that's way too long!&lt;br /&gt;&lt;br /&gt;Here's the short of it.&lt;br /&gt;&lt;br /&gt;Our reports were coming out funny.  Dimension column headings had one style and the Fact table column headings had another.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_rhCtHYLiamQ/S5EUBvp6DfI/AAAAAAABXtY/SnEtDnGNKSc/s800/01_example.png" alt="dim/fact difference" /&gt;&lt;br /&gt;&lt;br /&gt;Using &lt;a href="http://getfirebug.com/"&gt;Firebug&lt;/a&gt;, I could easily isolate the sections.&lt;br /&gt;&lt;br /&gt;On the Dimension column, the definition looked like this:&lt;pre class="code"&gt;&amp;lt;th  &lt;br /&gt;  class="ColumnHdg" &lt;br /&gt;  style="background-color: rgb(231, 231, 247); font-size: 9px; color: rgb(0, 51, 102);" &lt;br /&gt;  scope="col" &lt;br /&gt;  dir="ltr"&gt;Product Desc&lt;br /&gt;&amp;lt;/th&gt;&lt;/pre&gt;The Fact table column was defined as:&lt;pre class="code"&gt;&amp;lt;th &lt;br /&gt;  class="ColumnHdg" &lt;br /&gt;  scope="col" &lt;br /&gt;  dir="ltr"&gt;Basis Amount&lt;br /&gt;&amp;lt;/th&gt;&lt;/pre&gt;Note the style attribute...that overrides any class settings.  Very annoying.&lt;br /&gt;&lt;br /&gt;I thought it would be relatively simple to fix.  I worked with custom messages &lt;a href="http://www.oraclenerd.com/2010/01/obiee-tooltips-in-answers.html"&gt;before&lt;/a&gt;, this had to be similar.  So I began to "grep" the messages directory&lt;pre class="code"&gt;c:\oraclebi\web\msgdb\&gt;findstr /i /m /s /c:"background-color" *.*&lt;/pre&gt;Nothing.&lt;br /&gt;&lt;br /&gt;How about looking for the name of the class, ColumnHdg?&lt;pre class="code"&gt;c:\oraclebi\web\msgdb\&gt;findstr /i /m /s /c:"columnhdg" *.*&lt;br /&gt;messages\criteriatemplates.xml&lt;br /&gt;messages\formattemplates.xml&lt;br /&gt;messages\mktgadminuitemplates.xml&lt;br /&gt;messages\mktgcommontemplates.xml&lt;br /&gt;messages\mktglistformattemplates.xml&lt;br /&gt;messages\mktgsegmenttemplates.xml&lt;/pre&gt;So I start with criteriatemplates.xml and find the reference to columnHdg (just now realizing that the case doesn't match...oh well).  That was part of the WebMessage kuiColumnFormulaEditor.  So I searched for that...&lt;br /&gt;&lt;br /&gt;You see where I'm going.&lt;br /&gt;&lt;br /&gt;That lead me to the javascript files (of which there are tons).  Nothing...not a single thing that could possibly be adding this style attribute.&lt;br /&gt;&lt;br /&gt;That's when I mapped the dev server drive to my local computer and opened up &lt;a href="http://winmerge.org/downloads/"&gt;WinMerge&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I then began to compare every single file in both the msgdb and res (javascript) folders.  I would then compare the files that were different to see if that could be the cause.  Still...nothing.&lt;br /&gt;&lt;br /&gt;I had looked in the webcat before, but couldn't find anything of global significance.  I was headed back there though since I had lost hope with custom messages and/or javascript.&lt;br /&gt;&lt;br /&gt;Then I got a message from the OTN Forum Administrator...could it be?  Looked at the name of the person who answered it first, &lt;a href="http://obiee101.blogspot.com/"&gt;John Minkjan&lt;/a&gt;...sweet!&lt;blockquote&gt;Looks like you forgot to reset the OOB settings when installing OBIEE:&lt;br /&gt;have a look here to reset them:&lt;br /&gt;&lt;a href="http://obiee101.blogspot.com/2009/02/obiee-editing-system-wide-defaults.html"&gt;http://obiee101.blogspot.com/2009/02/obiee-editing-system-wide-defaults.html&lt;/a&gt;&lt;/blockquote&gt;Click through, follow his instructions, bounce the server and voila!&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/_rhCtHYLiamQ/S5QZvNrwa4I/AAAAAAABXuM/fvEM5vqARMg/s800/02_fixed.png" alt="voila!" /&gt;&lt;br /&gt;&lt;br /&gt;As of this writing, I don't know what OOB stands for; I could make something up, but it probably wouldn't be appropriate for this family site.&lt;br /&gt;&lt;br /&gt;Thanks John!&lt;div class="blogger-post-footer"&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3853911845992923";/* atom feed */google_ad_slot = "1428191201";google_ad_width = 728;google_ad_height = 15;//--&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8884584404576003487-1634881255268046159?l=www.oraclenerd.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/1634881255268046159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8884584404576003487&amp;postID=1634881255268046159' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/1634881255268046159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/1634881255268046159'/><link rel='alternate' type='text/html' href='http://www.oraclenerd.com/2010/03/obiee-default-answers-template.html' title='OBIEE: Default Answers Template?'/><author><name>oraclenerd</name><uri>http://www.blogger.com/profile/12412013306950057961</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03223434293565733241'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_rhCtHYLiamQ/S5EUBvp6DfI/AAAAAAABXtY/SnEtDnGNKSc/s72-c/01_example.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8884584404576003487.post-1204122841248382156</id><published>2010-03-03T15:48:00.000-05:00</published><updated>2010-03-03T15:53:49.905-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rpd'/><category scheme='http://www.blogger.com/atom/ns#' term='obiee'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><title type='text'>OBIEE: XML File as Data Source</title><content type='html'>I received a question in the form of a comment on using XML files &lt;a href="http://www.oraclenerd.com/2010/02/obiee-text-file-as-data-source.html?showComment=1267636667690#c1289179453432571695"&gt;here&lt;/a&gt;.  Fittingly, we were discussing this exact topic yesterday and I decided I would try it out.&lt;br /&gt;&lt;br /&gt;So here goes.&lt;br /&gt;&lt;br /&gt;You'll need 2 files: a XML file and a XSL stylesheet (which defines the XML file).  I found said files &lt;a href="http://www.w3schools.com/xsl/xsl_transformation.asp"&gt;here&lt;/a&gt;.  I'll also provide them &lt;a href="https://docs.google.com/leaf?id=0B-nJsFP6XMu0MzYxZWY3YWYtMzc4NC00ZjE4LTk4OGEtNDY0MDE2NTg4MDlk&amp;hl=en"&gt;here&lt;/a&gt; (cdcatalog.xml) and &lt;a href="https://docs.google.com/leaf?id=0B-nJsFP6XMu0YmU0MTUyMjgtMGFmNC00NjAxLWE2YjEtMmVjY2YyNWQ5ZDRl&amp;hl=en"&gt;here&lt;/a&gt; (cdcatalog.xls).&lt;br /&gt;&lt;br /&gt;In the Administration tool, go to File --&gt; Import --&gt; from Database&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_rhCtHYLiamQ/S465hNEr3JI/AAAAAAABXnI/a7JQnxzu2FY/s800/01_import_from_database.png.jpg" alt="file import from database" /&gt;&lt;br /&gt;&lt;br /&gt;When you prompted to select a datasource, select XML and the window should look like this&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/_rhCtHYLiamQ/S465hTK9ELI/AAAAAAABXnQ/JB4pzpJr5bQ/s800/02_xml_path.jpg" alt="XML blank" /&gt;&lt;br /&gt;&lt;br /&gt;For URL, browse to the location you saved cdcatalog.xml, do the same for XSLT&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_rhCtHYLiamQ/S465hqyFt_I/AAAAAAABXnY/WSW1dXI30Pw/s800/03_xml_path_final.jpg" alt="XML Full" /&gt;&lt;br /&gt;&lt;br /&gt;Hit OK and you'll be prompted with the Import dialog&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_rhCtHYLiamQ/S465h9w2WuI/AAAAAAABXng/CbTqYumDRow/s800/04_import.jpg" alt="Import Dialog" /&gt;&lt;br /&gt;&lt;br /&gt;Import the "table" and you're done.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh3.ggpht.com/_rhCtHYLiamQ/S465iZuX7wI/AAAAAAABXno/LK2iHc_KB2g/s800/05_xml_database.jpg" alt="XML Table! FTW!" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3853911845992923";/* atom feed */google_ad_slot = "1428191201";google_ad_width = 728;google_ad_height = 15;//--&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8884584404576003487-1204122841248382156?l=www.oraclenerd.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/1204122841248382156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8884584404576003487&amp;postID=1204122841248382156' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/1204122841248382156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/1204122841248382156'/><link rel='alternate' type='text/html' href='http://www.oraclenerd.com/2010/03/obiee-xml-file-as-data-source.html' title='OBIEE: XML File as Data Source'/><author><name>oraclenerd</name><uri>http://www.blogger.com/profile/12412013306950057961</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03223434293565733241'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_rhCtHYLiamQ/S465hNEr3JI/AAAAAAABXnI/a7JQnxzu2FY/s72-c/01_import_from_database.png.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8884584404576003487.post-7295702627460026997</id><published>2010-03-03T00:37:00.004-05:00</published><updated>2010-03-03T01:20:47.446-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='tuning'/><category scheme='http://www.blogger.com/atom/ns#' term='dba'/><title type='text'>Learning About Performance</title><content type='html'>I've found myself at a certain disadvantage lately, specifically in regards to understanding tuning.  I don't like being at a disadvantage...I'm &lt;a href="http://www.oraclenerd.com/2007/11/i-want-to-be-better-than-tom-kyte.html"&gt;competitive&lt;/a&gt; that way.&lt;br /&gt;&lt;br /&gt;I understand, from a &lt;i&gt;very&lt;/i&gt; high level of what needs to be done, but I could not prove my theories.  Well, I could, sort of, but it wasn't necessarily a reasoned or logical approach.  I just tried all possible permutations.  There's a certain time constraint with that method and when you're talking about huge volumes of data (i.e. datawarehouses), time is short.&lt;br /&gt;&lt;br /&gt;I've decided it's time to change that, so I'll begin to peck away ever so slowly.&lt;br /&gt;&lt;br /&gt;In Usage Tracking, there is a table called &lt;a href="https://docs.google.com/leaf?id=0B-nJsFP6XMu0ZGYxZTFlYzUtOWVjYy00NTkxLThkYmYtM2JlMDExZDVkN2Jl&amp;hl=en"&gt;S_ETL_TIME_DAY&lt;/a&gt;.  It's a sister table to S_ETL_DAY which is your everyday &lt;a href="http://www.oraclenerd.com/2009/03/how-to-populate-your-time-dimension.html"&gt;time dimension&lt;/a&gt;.  S_ETL_TIME_DAY breaks down a single day into hours and minutes which means there are 1440 records (24*60*60).  &lt;br /&gt;&lt;br /&gt;Somewhere I saw the following SQL:&lt;pre class="code"&gt;SELECT DISTINCT hours&lt;br /&gt;FROM s_etl_time_day&lt;/pre&gt;which just returns the hours in the day (24).  I've pondered on whether &lt;a href="http://www.oraclenerd.com/2009/01/is-distinct-bug.html"&gt;DISTINCT is a bug&lt;/a&gt;, but it seems fairly innocuous here.&lt;br /&gt;&lt;br /&gt;What about this though?&lt;pre class="code"&gt;SELECT rownum - 1 hours&lt;br /&gt;FROM dual&lt;br /&gt;  CONNECT BY LEVEL &lt;= 24;&lt;/pre&gt;Which one is faster?&lt;br /&gt;&lt;br /&gt;Let's try an explain plan&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Query 1&lt;/b&gt;&lt;pre class="code"&gt;S_NQ_SCHED@TESTING&gt;EXPLAIN PLAN FOR&lt;br /&gt;  2  SELECT rownum - 1 hours&lt;br /&gt;  3  FROM dual&lt;br /&gt;  4    CONNECT BY LEVEL &lt;= 24;&lt;br /&gt;&lt;br /&gt;Explained.&lt;br /&gt;&lt;br /&gt;Elapsed: 00:00:00.05&lt;br /&gt;S_NQ_SCHED@TESTING&gt;@EXPLAIN&lt;br /&gt;&lt;br /&gt;PLAN_TABLE_OUTPUT&lt;br /&gt;------------------------------------------------------------------------------&lt;br /&gt;Plan hash value: 1731520519&lt;br /&gt;&lt;br /&gt;------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation                     | Name | Rows  | Cost (%CPU)| Time     |&lt;br /&gt;------------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT              |      |     1 |     2   (0)| 00:00:01 |&lt;br /&gt;|   1 |  COUNT                        |      |       |            |          |&lt;br /&gt;|*  2 |   CONNECT BY WITHOUT FILTERING|      |       |            |          |&lt;br /&gt;|   3 |    FAST DUAL                  |      |     1 |     2   (0)| 00:00:01 |&lt;br /&gt;------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt;&lt;br /&gt;   2 - filter(LEVEL&lt;=24)&lt;br /&gt;&lt;br /&gt;15 rows selected.&lt;/pre&gt;&lt;b&gt;Query 2&lt;/b&gt;&lt;pre class="code"&gt;S_NQ_SCHED@TESTING&gt;EXPLAIN PLAN FOR&lt;br /&gt;  2  SELECT DISTINCT hours&lt;br /&gt;  3  FROM s_etl_time_day;&lt;br /&gt;&lt;br /&gt;Explained.&lt;br /&gt;&lt;br /&gt;Elapsed: 00:00:00.04&lt;br /&gt;S_NQ_SCHED@TESTING&gt;@explain&lt;br /&gt;&lt;br /&gt;PLAN_TABLE_OUTPUT&lt;br /&gt;--------------------------------------------------------------------------------------&lt;br /&gt;Plan hash value: 878743397&lt;br /&gt;&lt;br /&gt;-------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation          | Name           | Rows  | Bytes | Cost (%CPU)| Time     |&lt;br /&gt;-------------------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT   |                |    24 |    72 |     5  (20)| 00:00:01 |&lt;br /&gt;|   1 |  HASH UNIQUE       |                |    24 |    72 |     5  (20)| 00:00:01 |&lt;br /&gt;|   2 |   TABLE ACCESS FULL| S_ETL_TIME_DAY |  1440 |  4320 |     4   (0)| 00:00:01 |&lt;br /&gt;-------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;9 rows selected.&lt;/pre&gt;Sadly, about the only thing I can usually see in an explain plan is whether an index is being picked up or if there is a nested loop.  I'm not going to worry about &lt;i&gt;all&lt;/i&gt; of it now...this is just a start.  More to get me in the habit.&lt;br /&gt;&lt;br /&gt;Next I set up tracing since "reading" the file is so much &lt;a href="http://www.oraclenerd.com/2010/02/soug-sql-developer-with-syme-kutz.html"&gt;easier&lt;/a&gt; now.&lt;pre class="code"&gt;ALTER SESSION SET TRACEFILE_IDENTIFIER = 'HOURS';&lt;br /&gt;&lt;br /&gt;ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12';&lt;/pre&gt;Here's the output:&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Query 1&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Query 2&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src="http://lh5.ggpht.com/_rhCtHYLiamQ/S438Q9O4aQI/AAAAAAABXjY/hB0FRUy76fk/s800/01_query_1_statistics.png"&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="http://lh3.ggpht.com/_rhCtHYLiamQ/S438Q22CSwI/AAAAAAABXjc/HOmhn3D-Iw8/s800/01_query_2_statistics.png" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src="http://lh5.ggpht.com/_rhCtHYLiamQ/S438Q3FggrI/AAAAAAABXjg/9Sc9BzZwKP8/s800/02_query_1_waits.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="http://lh3.ggpht.com/_rhCtHYLiamQ/S438RG8h6pI/AAAAAAABXjk/gdieVvbHc1M/s800/02_query_2_waits.png" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src="http://lh4.ggpht.com/_rhCtHYLiamQ/S438RVwV5XI/AAAAAAABXjo/-5FRUDZ_egU/s800/03_query_1_row_sources.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="http://lh3.ggpht.com/_rhCtHYLiamQ/S438ZCm9fnI/AAAAAAABXjw/ZYdkOZxGhHs/s800/03_query_2_row_sources.png" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;What does it all mean?  I am sure you know or understand better than I.  For me, I just need to create the habit.  I'll read (more) about the specifics of the explain plan and the output from tkprof.  If you want to explain, feel free.  If you want to do it in your own post, link it up or you can write it here.  I'd be happy to host it.&lt;div class="blogger-post-footer"&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3853911845992923";/* atom feed */google_ad_slot = "1428191201";google_ad_width = 728;google_ad_height = 15;//--&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8884584404576003487-7295702627460026997?l=www.oraclenerd.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/7295702627460026997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8884584404576003487&amp;postID=7295702627460026997' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/7295702627460026997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/7295702627460026997'/><link rel='alternate' type='text/html' href='http://www.oraclenerd.com/2010/03/learning-about-performance.html' title='Learning About Performance'/><author><name>oraclenerd</name><uri>http://www.blogger.com/profile/12412013306950057961</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03223434293565733241'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_rhCtHYLiamQ/S438Q9O4aQI/AAAAAAABXjY/hB0FRUy76fk/s72-c/01_query_1_statistics.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8884584404576003487.post-667697250101963583</id><published>2010-03-02T22:25:00.000-05:00</published><updated>2010-03-14T17:44:19.378-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='2010'/><category scheme='http://www.blogger.com/atom/ns#' term='collaborate'/><category scheme='http://www.blogger.com/atom/ns#' term='blogging'/><title type='text'>COLLABORATE 10</title><content type='html'>&lt;img src="http://lh6.ggpht.com/_rhCtHYLiamQ/S42q80dVjzI/AAAAAAABXgs/OqDUFFVUgvQ/s400/01_collaborate.png" alt="collaborate logo" style="float:right;" /&gt;Today I got notice that I would be granted a blogger pass for COLLABORATE 10 in Las Vegas, NV.  Vegas baby, Vegas!  What's more, all three groups, &lt;a href="http://www.ioug.org/"&gt;IOUG&lt;/a&gt;, &lt;a href="http://www.oaug.com/"&gt;OAUG&lt;/a&gt; and &lt;a href="http://www.questdirect.org/questdirect/"&gt;Quest&lt;/a&gt; approved.  &lt;br /&gt;&lt;br /&gt;If you weren't aware, I had the same &lt;a href="http://www.oraclenerd.com/2009/03/collaborate-09-oaug-forum.html"&gt;deal&lt;/a&gt; last year through OAUG.  I realized, very quickly, that living up to the obligation was very tough.  I wrote 13 &lt;a href="http://www.oraclenerd.com/2009/05/collaborate-09-wrap-up.html"&gt;articles&lt;/a&gt; over that short span of time and it was completely &lt;a href="http://www.oraclenerd.com/2009/05/burnout.html"&gt;exhausting&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So of course I want to do it again...I'm a glutton for punishment I guess.&lt;div class="blogger-post-footer"&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3853911845992923";/* atom feed */google_ad_slot = "1428191201";google_ad_width = 728;google_ad_height = 15;//--&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8884584404576003487-667697250101963583?l=www.oraclenerd.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/667697250101963583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8884584404576003487&amp;postID=667697250101963583' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/667697250101963583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/667697250101963583'/><link rel='alternate' type='text/html' href='http://www.oraclenerd.com/2010/03/collaborate-10.html' title='COLLABORATE 10'/><author><name>oraclenerd</name><uri>http://www.blogger.com/profile/12412013306950057961</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03223434293565733241'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_rhCtHYLiamQ/S42q80dVjzI/AAAAAAABXgs/OqDUFFVUgvQ/s72-c/01_collaborate.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8884584404576003487.post-2765444840145536729</id><published>2010-03-02T10:38:00.002-05:00</published><updated>2010-03-02T10:57:50.301-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql developer'/><category scheme='http://www.blogger.com/atom/ns#' term='wtf'/><category scheme='http://www.blogger.com/atom/ns#' term='dba'/><title type='text'>DBA_TABLES vs DBA_OBJECTS</title><content type='html'>&lt;pre class="code"&gt;CJUSTICE@TESTING&gt;SELECT * FROM V$VERSION;&lt;br /&gt;&lt;br /&gt;BANNER&lt;br /&gt;----------------------------------------------------------------&lt;br /&gt;Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod&lt;br /&gt;PL/SQL Release 10.2.0.3.0 - Production&lt;br /&gt;CORE    10.2.0.3.0      Production&lt;br /&gt;TNS for 32-bit Windows: Version 10.2.0.3.0 - Production&lt;br /&gt;NLSRTL Version 10.2.0.3.0 - Production&lt;/pre&gt;Last night I was installing the Unit Testing repository for SQL Developer for a fun little post.  After installing the repository, I just did a brief sanity check.&lt;pre class="code"&gt;CJUSTICE@TESTING&gt;SELECT owner, COUNT(*) c&lt;br /&gt;  2  FROM dba_objects&lt;br /&gt;  3  GROUP BY owner&lt;br /&gt;  4  ORDER BY 1;&lt;br /&gt;  &lt;br /&gt;  OWNER                                   C&lt;br /&gt;------------------------------ ----------&lt;br /&gt;...snip&lt;br /&gt;SI_INFORMTN_SCHEMA                      8&lt;br /&gt;SYS                                 22970&lt;br /&gt;SYSMAN                               1341&lt;br /&gt;SYSTEM                                454&lt;br /&gt;S_NQ_SCHED                              3&lt;br /&gt;TSMSYS                                  3&lt;br /&gt;WMSYS                                 242&lt;br /&gt;XDB                                   682&lt;br /&gt;&lt;br /&gt;27 rows selected.&lt;/pre&gt;Strange.&lt;br /&gt;&lt;br /&gt;I created a user, UNIT_TESTING, to house the data and fed it to SQL Developer.  Did I create the user?&lt;pre class="code"&gt;CJUSTICE@TESTING&gt;SELECT COUNT(*) &lt;br /&gt;FROM dba_users &lt;br /&gt;WHERE username = 'UNIT_TESTING';&lt;br /&gt;&lt;br /&gt;  COUNT(*)&lt;br /&gt;----------&lt;br /&gt;         1&lt;/pre&gt;Yeah.&lt;br /&gt;         &lt;br /&gt;I check DBA_OBJECTS using UNIT_TESTING as the predicate:&lt;pre class="code"&gt;CJUSTICE@TESTING&gt;SELECT * FROM dba_objects WHERE owner = 'UNIT_TESTING';&lt;br /&gt;&lt;br /&gt;no rows selected&lt;/pre&gt;Really?&lt;pre class="code"&gt;CJUSTICE@TESTING&gt;SELECT table_name&lt;br /&gt;  2  FROM dba_tables&lt;br /&gt;  3  WHERE owner = 'UNIT_TESTING';&lt;br /&gt;&lt;br /&gt;TABLE_NAME&lt;br /&gt;------------------------------&lt;br /&gt;UT_LIB_TEARDOWNS&lt;br /&gt;UT_LOOKUP_CATEGORIES&lt;br /&gt;UT_LOOKUP_DATATYPES&lt;br /&gt;UT_LOOKUP_VALUES&lt;br /&gt;UT_METADATA&lt;br /&gt;UT_TEST&lt;br /&gt;UT_TEST_ARGUMENTS&lt;br /&gt;UT_TEST_IMPL&lt;br /&gt;UT_VALIDATIONS&lt;br /&gt;UT_TEST_IMPL_ARGUMENTS&lt;br /&gt;UT_LIB_STARTUPS&lt;br /&gt;UT_LIB_VALIDATIONS&lt;br /&gt;UT_LIB_DYN_QUERIES&lt;br /&gt;UT_SUITE&lt;br /&gt;UT_SUITE_TEST&lt;br /&gt;UT_TEST_IMPL_VAL_RESULTS&lt;br /&gt;UT_TEST_IMPL_ARG_RESULTS&lt;br /&gt;UT_TEST_IMPL_RESULTS&lt;br /&gt;UT_TEST_COVERAGE_STATS&lt;br /&gt;UT_TEST_RESULTS&lt;br /&gt;UT_SUITE_RESULTS&lt;br /&gt;UT_SUITE_TEST_RESULTS&lt;br /&gt;&lt;br /&gt;22 rows selected.&lt;/pre&gt;WTF?&lt;br /&gt;&lt;br /&gt;Does this mean that my data dictionary is corrupted?  This is a sandbox so it is very well possible...just never seen this kind of thing before.&lt;div class="blogger-post-footer"&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3853911845992923";/* atom feed */google_ad_slot = "1428191201";google_ad_width = 728;google_ad_height = 15;//--&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8884584404576003487-2765444840145536729?l=www.oraclenerd.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/2765444840145536729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8884584404576003487&amp;postID=2765444840145536729' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/2765444840145536729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/2765444840145536729'/><link rel='alternate' type='text/html' href='http://www.oraclenerd.com/2010/03/dbatables-vs-dbaobjects.html' title='DBA_TABLES vs DBA_OBJECTS'/><author><name>oraclenerd</name><uri>http://www.blogger.com/profile/12412013306950057961</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03223434293565733241'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8884584404576003487.post-207042025613338948</id><published>2010-03-01T22:30:00.000-05:00</published><updated>2010-03-01T22:40:50.845-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='obiee'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><title type='text'>OBIEE: Dynamic Variables</title><content type='html'>Apparently this is a 3 part series, Part I, &lt;a href="http://www.oraclenerd.com/2010/02/obiee-text-file-as-data-source.html"&gt;OBIEE: Text File as Data Source&lt;/a&gt; and Part II, &lt;a href="http://www.oraclenerd.com/2010/02/obiee-create-repository-init-block.html"&gt;OBIEE: Create Repository Init Block&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Finally, to the ultimate goal, dynamic session variables.  Ideally, these would be repository variables, but since I'm using the row-wise variety, that is not possible (as of 10.1.3.4).  Once a day, or some other relatively long time frame would be sufficient.  &lt;br /&gt;&lt;br /&gt;Anyway, there's an occasion where dynamically creating variables might be needed or necessary.&lt;br /&gt;&lt;br /&gt;To recap the problem&lt;blockquote&gt;Due to certain restrictions in our environment, the tnsnames entries in our separate environments (Dev/QA/Stage/Prod) are exactly the same. I would prefer to have one entry in each environment that points to that environments database, but alas, I cannot. What this does is forces us to change the password in the connection pools when migrating. I know it's not ideal, but it is what it is.&lt;br /&gt;&lt;br /&gt;The proof of concept I am embarking on will allow us to lookup the tnsname entry and the associated password for that environment, theoretically, requiring no changes between environments.&lt;br /&gt;&lt;br /&gt;In that respect, it was decided that we would have a single service account. From that service account, we could look up the values we need for each environment. Here's the other fun problem...what comes first? The chicken or the egg? This service account password will be stored in a simple text file that will be locked down by the system administrators. Don't ask what happens when the password changes either. At this point, it's just a proof of concept. So be gentle. If you have an established way to manage passwords...please share.&lt;/blockquote&gt;A few people did chime in, Pete Scott suggesting using the a command line utility detailed &lt;a href="http://oraclebizint.wordpress.com/2008/05/02/oracle-bi-ee-101332-automating-password-updates-of-connection-pools-and-users-command-line-options/"&gt;here&lt;/a&gt;.  &lt;a href="http://twitter.com/nephentur"&gt;Christian&lt;/a&gt; chimed in that I should use it at my own risk and &lt;a href="http://twitter.com/rnm1978"&gt;rnm1978&lt;/a&gt; said this problem has not been truly solved yet.&lt;blockquote&gt;The whole issue of migration OBIEE deployments through the environments is a bit of a pig's ear with no foolproof method that I've seen&lt;/blockquote&gt;I need to look up that phrase as I'm certain it's peculiar to my brethren across the pond.&lt;br /&gt;&lt;br /&gt;Finally, the meat of the post.  Here's my table:&lt;pre class="code"&gt;OBI@TESTING&gt;@desc obi_variables&lt;br /&gt; Name                           Null?    Type&lt;br /&gt; ------------------------------ -------- -------------&lt;br /&gt; VARIABLE_NAME                  NOT NULL VARCHAR2(50)&lt;br /&gt; VARIABLE_VALUE                 NOT NULL VARCHAR2(250)&lt;br /&gt; VARIABLE_TYPE_CODE             NOT NULL VARCHAR2(30)&lt;/pre&gt;I'll throw a few records in there for fun (and to obviously demonstrate).&lt;pre class="code"&gt;INSERT INTO obi_variables&lt;br /&gt;  ( variable_name,&lt;br /&gt;    variable_value,&lt;br /&gt;    variable_type_code )&lt;br /&gt;VALUES&lt;br /&gt;  ( 'TNS_TESTING',&lt;br /&gt;    'TESTING',&lt;br /&gt;    'TNSNAME' );&lt;br /&gt;&lt;br /&gt;INSERT INTO obi_variables&lt;br /&gt;  ( variable_name,&lt;br /&gt;    variable_value,&lt;br /&gt;    variable_type_code )&lt;br /&gt;VALUES&lt;br /&gt;  ( 'PW_TESTING',&lt;br /&gt;    'TESTING',&lt;br /&gt;    'PASSWORD' );&lt;br /&gt;&lt;br /&gt;INSERT INTO obi_variables&lt;br /&gt;  ( variable_name,&lt;br /&gt;    variable_value,&lt;br /&gt;    variable_type_code )&lt;br /&gt;VALUES&lt;br /&gt;  ( 'URL_TESTING',&lt;br /&gt;    'http://localhost:7777/pls/apex/f?p=101:1',&lt;br /&gt;    'URL' );&lt;br /&gt;&lt;br /&gt;TYPE       VARIABLE_NAM VARIABLE_VALUE&lt;br /&gt;---------- ------------ ------------------------------------------&lt;br /&gt;PASSWORD   PW_TESTING   TESTING&lt;br /&gt;URL        URL_TESTING  http://localhost:7777/pls/apex/f?p=101:1&lt;br /&gt;TNSNAME    TNS_TESTING  TESTING&lt;/pre&gt;For demonstration purposes, I am going to create a new database in the Physical layer and add a connection pool called obi variables pool.  From the previous post, I'll be using the values that I brought in through the text file.  The only difference is that I added username...just in case.  To sum that up, I'm bringing in the TNSNAME entry, the USERNAME and the PASSWORD.&lt;br /&gt;&lt;br /&gt;Your connection pool should look like this:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh3.ggpht.com/_rhCtHYLiamQ/S4yHQXrhmxI/AAAAAAABXcg/rtDRXkD4Z6E/s800/01_obi_variable_pool.png" alt="connection pool" /&gt;&lt;br /&gt;&lt;br /&gt;The password column is the same format as the others, VALUEOF( INIT_PASSWORD )&lt;br /&gt;&lt;br /&gt;You'll have to re-enter that when you save.&lt;br /&gt;&lt;br /&gt;Now I'll be creating an init block using this connection pool.  I won't drag you through that entire process again (your welcome).  This is a Session Init Block as opposed to the Repository Init Block in the previous example.  &lt;br /&gt;&lt;br /&gt;The only difference is that I will be using a row-wise variable.  I'll get to that in a second.&lt;br /&gt;&lt;br /&gt;After selecting the obi variable pool connection pool, entering the following SQL statement into the area provided:&lt;pre class="code"&gt;SELECT variable_name, variable_value&lt;br /&gt;FROM obi_variables&lt;/pre&gt;.In the Edit Data Target area, select the row-wise initialization variable.  Select OK.&lt;br /&gt;&lt;br /&gt;Test it and voila!  You now have dynamic variables in OBIEE.&lt;div class="blogger-post-footer"&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3853911845992923";/* atom feed */google_ad_slot = "1428191201";google_ad_width = 728;google_ad_height = 15;//--&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8884584404576003487-207042025613338948?l=www.oraclenerd.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/207042025613338948/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8884584404576003487&amp;postID=207042025613338948' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/207042025613338948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/207042025613338948'/><link rel='alternate' type='text/html' href='http://www.oraclenerd.com/2010/03/obiee-dynamic-variables.html' title='OBIEE: Dynamic Variables'/><author><name>oraclenerd</name><uri>http://www.blogger.com/profile/12412013306950057961</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03223434293565733241'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_rhCtHYLiamQ/S4yHQXrhmxI/AAAAAAABXcg/rtDRXkD4Z6E/s72-c/01_obi_variable_pool.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8884584404576003487.post-3984150614654210768</id><published>2010-02-28T23:55:00.002-05:00</published><updated>2010-03-01T00:34:53.458-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='obiee'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='reports'/><title type='text'>OBIEE:  Single/Detail Record View</title><content type='html'>Recently, I've been searching for a Single Row/Detail type report in Answers.  Sadly, there isn't one so named.&lt;br /&gt;&lt;br /&gt;Here's what I could find in Answers:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_rhCtHYLiamQ/S4tK1KpcpxI/AAAAAAABXYw/e98kZzZ5oSE/s800/02_single_row.png" alt="report types" /&gt;&lt;br /&gt;&lt;br /&gt;Nothing jumps out at me, so, Twitter to the rescue again&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/oraclenerd/status/9583059468"&gt;&lt;img src="http://lh4.ggpht.com/_rhCtHYLiamQ/S4tKHnByoFI/AAAAAAABXYo/WbRPdQI5NwA/s800/01_twitter.png"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Within minutes...I had an answer from Mr. &lt;a href="http://twitter.com/nephentur"&gt;Christian Berg&lt;/a&gt;.  What was that answer?  The Narrative View.&lt;br /&gt;&lt;br /&gt;Here's the screen for the Narrative View:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh3.ggpht.com/_rhCtHYLiamQ/S4tNYlwd8yI/AAAAAAABXZU/7ocAruOHj4M/s800/06_narrative_view.png" alt="narrative view screen" /&gt;&lt;br /&gt;&lt;br /&gt;According to Mr. Berg, you reference the columns using the @1 (@2, @3, etc) syntax, the number representing the column number.  So I tried that&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_rhCtHYLiamQ/S4tNY-QrQ0I/AAAAAAABXZY/8QO1Rw0L1Cg/s800/07_narrative_view.png" src="" alt="narrative view with stuff" /&gt;&lt;br /&gt;&lt;br /&gt;Run it...&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_rhCtHYLiamQ/S4tNYn7mzkI/AAAAAAABXZQ/D9ZVBw9gwPo/s800/05_narrative_view.png" alt="not what I want" /&gt;&lt;br /&gt;&lt;br /&gt;That's not what I want...&lt;br /&gt;&lt;br /&gt;OK, so let's see if I can add some HTML to it.  First I check the Contains HTML Markup box and then I enter in the following in the Narrative Text Area:&lt;pre class="code"&gt;@1&amp;lt;br&gt;&lt;br /&gt;@2&amp;lt;br&gt;&lt;br /&gt;@3&amp;lt;br&gt;&lt;br /&gt;@4&amp;lt;br&gt;&lt;br /&gt;@5&amp;lt;br&gt;&lt;br /&gt;@6&amp;lt;br&gt;&lt;br /&gt;@7&amp;lt;br&gt;&lt;br /&gt;@8&amp;lt;br&gt;&lt;br /&gt;@9&amp;lt;br&gt;&lt;/pre&gt;Here's what it looks like:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_rhCtHYLiamQ/S4tQ3ZZ9EzI/AAAAAAABXZ8/iSvTC2NJ6HU/s800/08_bettewr.png" alt="a better narrative look" /&gt;&lt;br /&gt;&lt;br /&gt;Better, but not exactly what I want.  Now that I know I can use HTML though, it should be very easy.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/_rhCtHYLiamQ/S4tRv7B-8yI/AAAAAAABXaI/nowod42cxF0/s800/09_narrative_good_stuff.png" alt="perfect!" /&gt;&lt;br /&gt;&lt;br /&gt;Voila!&lt;div class="blogger-post-footer"&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3853911845992923";/* atom feed */google_ad_slot = "1428191201";google_ad_width = 728;google_ad_height = 15;//--&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8884584404576003487-3984150614654210768?l=www.oraclenerd.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/3984150614654210768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8884584404576003487&amp;postID=3984150614654210768' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/3984150614654210768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/3984150614654210768'/><link rel='alternate' type='text/html' href='http://www.oraclenerd.com/2010/02/obiee-singledetail-record-view.html' title='OBIEE:  Single/Detail Record View'/><author><name>oraclenerd</name><uri>http://www.blogger.com/profile/12412013306950057961</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03223434293565733241'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_rhCtHYLiamQ/S4tK1KpcpxI/AAAAAAABXYw/e98kZzZ5oSE/s72-c/02_single_row.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8884584404576003487.post-7220396406004942746</id><published>2010-02-28T22:06:00.004-05:00</published><updated>2010-03-05T01:27:19.998-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jpiwowar'/><category scheme='http://www.blogger.com/atom/ns#' term='obiee'/><category scheme='http://www.blogger.com/atom/ns#' term='random'/><category scheme='http://www.blogger.com/atom/ns#' term='ebs'/><title type='text'>Random Things:  Volume#16</title><content type='html'>&lt;b&gt;EBS Challenge&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.oraclenerd.com/labels/jpiwowar.html"&gt;John Piwowar&lt;/a&gt; wrote the first part of the EBS Installation Guide back in December, since then, it's become a runaway success.  I hadn't realized how so until recently when I was looking at Google Analytics and it came it at number 19, for all time.  Now it's up to 13 and with the addition of it to the front page, it should only go up faster.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/u2EkOOAMlaYfkDGo9xUicg?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_rhCtHYLiamQ/S4szZgxU7PI/AAAAAAABXXE/wApW_1kWZXw/s400/04_ebs_part_1.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've never had a post that was this popular so I thought it fitting that John should get the recognition that he deserves.  If you decide to take part and then write it up, let me know and I'll link you up to &lt;a href="http://www.oraclenerd.com/2009/12/ebs-challenge.html"&gt;The EBS Challenge&lt;/a&gt;page.  I think there are 4 people that have completed it so far.  I'll even give you space here if you don't have your own blog.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Travel&lt;/b&gt;&lt;br /&gt;Got the best color car ever this week.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/6Fta0V4FhX1LydEHqbPorA?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_rhCtHYLiamQ/S4qjtCCmpLI/AAAAAAABXUE/CCrgG9u-G_w/s288/IMG00146.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;OBI EE&lt;/b&gt;&lt;br /&gt;For some reason my original, &lt;a href="http://www.oraclenerd.com/2009/01/learning-oracle-business-intelligence.html"&gt;Learning Oracle Business Intelligence (OBIEE) &lt;/a&gt;post, has been near the top of the charts for multiple search phrases.&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/A52EUcxzRXHny2z5cJnKBg?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_rhCtHYLiamQ/S4sxiv-LwII/AAAAAAABXV0/Y5DWOKI0FZ0/s288/01_obiee_tutorial.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;&lt;a href="http://picasaweb.google.com/lh/photo/p9C2oe6tV9d3OV5IKBtBnA?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_rhCtHYLiamQ/S4sxij9asiI/AAAAAAABXV4/03qUaar-_-I/s400/02_learn_obiee.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/P_ugj-HCJ9cHn8XM-KtCaQ?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_rhCtHYLiamQ/S4sxiyEkXcI/AAAAAAABXV8/mNa2sO9qod0/s288/03_how_to_learn_obiee.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;So I did what any sane person would do, I updated it with some new information.  Not really sure if it's new, but it's got more.  If people are finding it, I might as well update it as often as possible.&lt;div class="blogger-post-footer"&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3853911845992923";/* atom feed */google_ad_slot = "1428191201";google_ad_width = 728;google_ad_height = 15;//--&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8884584404576003487-7220396406004942746?l=www.oraclenerd.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/7220396406004942746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8884584404576003487&amp;postID=7220396406004942746' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/7220396406004942746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/7220396406004942746'/><link rel='alternate' type='text/html' href='http://www.oraclenerd.com/2010/02/random-things-volume16.html' title='Random Things:  Volume#16'/><author><name>oraclenerd</name><uri>http://www.blogger.com/profile/12412013306950057961</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03223434293565733241'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_rhCtHYLiamQ/S4szZgxU7PI/AAAAAAABXXE/wApW_1kWZXw/s72-c/04_ebs_part_1.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8884584404576003487.post-323532868108399841</id><published>2010-02-26T00:47:00.003-05:00</published><updated>2010-02-26T01:39:57.710-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql developer'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='soug'/><title type='text'>SOUG:  SQL Developer with Syme Kutz</title><content type='html'>Tonight was the Suncoast Oracle User Group (&lt;a href="http://soug.acomp.usf.edu/"&gt;SOUG&lt;/a&gt;) meeting with Syme (pronounced Sim-e, I thought it was Si-me) Kutz of Oracle presenting on SQL Developer, mainly the new Unit Testing functionality.&lt;br /&gt;&lt;br /&gt;Unfortunately, I missed the first half of the meeting due to a flight delay, but from what I did see, it's very cool.  If you read the &lt;a href="http://www.oraclenerd.com/2010/02/soug-sql-developer-unit-testing.html"&gt;announcement&lt;/a&gt; last week, you'll remember that &lt;a href="http://twitter.com/krisrice"&gt;Kris Rice&lt;/a&gt; had offered up (aka - threw under the bus) Syme.  I made first contact and then passed the baton to our meeting coordinator who finalized the arrangement.&lt;br /&gt;&lt;br /&gt;If you want to check out the Unit Testing features, you need the latest release (2.1), which can be found &lt;a href="http://www.oracle.com/technology/software/products/sql/index.html"&gt;here&lt;/a&gt;.  To access it, go to Tools --&gt; Unit Testing&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_rhCtHYLiamQ/S4djx6pl-3I/AAAAAAABXQ8/oGKNhuABVig/s800/01_unit_testing.png" alt="unit testing" /&gt;&lt;br /&gt;&lt;br /&gt;I won't go into gory details simply because I need to &lt;i&gt;use&lt;/i&gt; the dang thing first.  I'm sure I'll have some posts in the near future.&lt;br /&gt;&lt;br /&gt;Anyway, what I did see was pretty slick.&lt;br /&gt;&lt;br /&gt;Syme then gave us some history of the product (developed originally by himself and Mr. Rice) and explained a bit more about some of the functionality.  Many of you already know about the integration with APEX (I don't know much, other than it exists).  That's about to be expanded and will give even more control over many aspects of APEX, including some pretty tight integration with the Unit Testing module.&lt;br /&gt;&lt;br /&gt;One really cool thing that he mentioned, if you open up a trace file in SQL Developer, you get a pretty report for it.  Apparently reverse engineered from tkprof.&lt;br /&gt;&lt;br /&gt;First, find your trace file:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh3.ggpht.com/_rhCtHYLiamQ/S4drW-MQ4SI/AAAAAAABXRc/_yKvwuxhYXo/s800/03_find_trace_file.png" alt="find trace file" /&gt;&lt;br /&gt;&lt;br /&gt;Double click it to open it and you'll see something like this (you'll have to click through on this one):&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/j0p1qItehUTTY9JPR9YG9g?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_rhCtHYLiamQ/S4drW1uFWFI/AAAAAAABXRg/uNK626Jr33I/s400/04_big_picture.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I will break it down if you're too lazy though.&lt;br /&gt;&lt;br /&gt;The first column of the report is the SQL:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/XdXMITqqcudZHiBR08HNQw?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_rhCtHYLiamQ/S4drXdR7PkI/AAAAAAABXRo/jaMZhc0Skck/s800/05_sql.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Next up are the statistics:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/hZ7uh3sDy0qPld9GReN5JQ?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_rhCtHYLiamQ/S4drXQv_oTI/AAAAAAABXRs/unyKrllvs3c/s800/06_statistics.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Waits:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/Hkiym7gY4x7X5bCxD51IMg?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_rhCtHYLiamQ/S4dreO427jI/AAAAAAABXR0/2LX3ajdmirM/s800/07_waits.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and finally Row Sources:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/75CK5mZ8Iijmx9fh56hlJw?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_rhCtHYLiamQ/S4dreLIsZnI/AAAAAAABXR4/CJQ_8rytgdk/s800/08_row_sources.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pretty slick stuff.&lt;br /&gt;&lt;br /&gt;Thanks Syme for coming down, hopefully we can get you down here again to show us the rest.&lt;div class="blogger-post-footer"&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3853911845992923";/* atom feed */google_ad_slot = "1428191201";google_ad_width = 728;google_ad_height = 15;//--&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8884584404576003487-323532868108399841?l=www.oraclenerd.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/323532868108399841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8884584404576003487&amp;postID=323532868108399841' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/323532868108399841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/323532868108399841'/><link rel='alternate' type='text/html' href='http://www.oraclenerd.com/2010/02/soug-sql-developer-with-syme-kutz.html' title='SOUG:  SQL Developer with Syme Kutz'/><author><name>oraclenerd</name><uri>http://www.blogger.com/profile/12412013306950057961</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03223434293565733241'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_rhCtHYLiamQ/S4djx6pl-3I/AAAAAAABXQ8/oGKNhuABVig/s72-c/01_unit_testing.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8884584404576003487.post-6397080347232898865</id><published>2010-02-24T22:17:00.004-05:00</published><updated>2010-02-24T23:32:37.976-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='obiee'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><title type='text'>OBIEE: Create Repository Init Block</title><content type='html'>My post earlier today, &lt;a href="http://www.oraclenerd.com/2010/02/obiee-text-file-as-data-source.html"&gt;OBIEE: Text File as Data Source &lt;/a&gt;, was the first part of my overall goal.&lt;br /&gt;&lt;br /&gt;Here's what I'm trying to do.  Due to certain restrictions in our environment, the tnsnames entries in our separate environments (Dev/QA/Stage/Prod) are exactly the same.  I would prefer to have one entry in each environment that points to that environments database, but alas, I cannot.  What this does is forces us to change the password in the connection pools when migrating.  I know it's not ideal, but it is what it is.&lt;br /&gt;&lt;br /&gt;The proof of concept I am embarking on will allow us to lookup the tnsname entry and the associated password for that environment, theoretically, requiring &lt;i&gt;&lt;b&gt;no&lt;/b&gt;&lt;/i&gt; changes between environments.&lt;br /&gt;&lt;br /&gt;In that respect, it was decided that we would have a single service account.  From that service account, we could look up the values we need for each environment.  Here's the other fun problem...what comes first?  The chicken or the egg?  This service account password will be stored in a simple text file that will be locked down by the system administrators.  Don't ask what happens when the password changes either.  At this point, it's just a proof of concept.  So be gentle.  If you have an established way to manage passwords...please share.&lt;br /&gt;&lt;br /&gt;We've &lt;a href="http://www.oraclenerd.com/2010/02/obiee-text-file-as-data-source.html"&gt;pulled&lt;/a&gt; the text file into the RPD already.  Now, I need to create 2 repository variables to hold these values.  I open up the Administration tool, go to Manage then variables.  You should see this:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_rhCtHYLiamQ/S4X0MpmoNLI/AAAAAAABXIM/ahX4SAjD4Wk/s800/01_variable_manager.jpg" alt="variable manager" /&gt;&lt;br /&gt;&lt;br /&gt;Then follow this picture to create a new Initialization Block&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/_rhCtHYLiamQ/S4X3lF5bpKI/AAAAAAABXKU/vjzC7WzOGpQ/s800/02_new_init_block.jpg" alt="create init block" /&gt;&lt;br /&gt;&lt;br /&gt;Name your Initialization block init_block_test&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_rhCtHYLiamQ/S4X0NRPVB0I/AAAAAAABXIc/xtnbLg0VlKo/s400/03_create_init_block.jpg" alt="big picture" /&gt;&lt;br /&gt;&lt;br /&gt;Leave the scheduler stuff alone for now, click on Edit Data Source&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/_rhCtHYLiamQ/S4X0N4rcaII/AAAAAAABXIk/D9-PkXZnyQc/s800/04_edit_data_source.jpg" alt="some funny caption goes here" /&gt;&lt;br /&gt;&lt;br /&gt;First, browse for the connection pool&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_rhCtHYLiamQ/S4X0Px95FJI/AAAAAAABXI8/f3ADFKOnrvg/s800/08_browse.jpg" alt="kthxbi" /&gt;&lt;br /&gt;&lt;br /&gt;Select the get_local_password (yes, the name mysteriously changed from the default Connection Pool to "get_local_password," it makes sense doesn't it?).&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh3.ggpht.com/_rhCtHYLiamQ/S4X0QevEXZI/AAAAAAABXJE/Cczm1hvcyX0/s800/09_select_connection_pool.jpg" alt="teh tubes!" /&gt;&lt;br /&gt;&lt;br /&gt;In the Default Initialization String text box, enter:&lt;pre class="code"&gt;SELECT username, password &lt;br /&gt;FROM test.txt&lt;/pre&gt;You can test it if you want, but I'm saving it for the final step.&lt;br /&gt;&lt;br /&gt;Your Initialization Block Data Source should look like this&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_rhCtHYLiamQ/S4X0Q48FIBI/AAAAAAABXJM/kMMak0vAUqY/s800/10_test.jpg" alt="bollocks" /&gt;&lt;br /&gt;&lt;br /&gt;Now select Edit Data Target&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/_rhCtHYLiamQ/S4X0OAGv5uI/AAAAAAABXIs/B0Rq464ThTI/s800/05_edit_variables.jpg" alt="edit variables" /&gt;&lt;br /&gt;&lt;br /&gt;Which looks like this&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_rhCtHYLiamQ/S4X0RO-ultI/AAAAAAABXJU/uFyLc69TkH4/s800/12_create_variable.jpg" alt="add block variable target" /&gt;&lt;br /&gt;&lt;br /&gt;Select New and enter INIT_USERNAME in the Name text box and make the Default Initializer 'USERNAME' (in single quotes).  &lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/_rhCtHYLiamQ/S4X62EFLgNI/AAAAAAABXMI/bnHTTMl7GaI/s800/16_dyn_repo_variable.jpg" alt="init username variable" /&gt;&lt;br /&gt;&lt;br /&gt;Do the same thing for the password column, INIT_PASSWORD and 'PASSWORD'&lt;br /&gt;&lt;br /&gt;Now you are back at the main screen and the Test button (lower left hand corner) should be enabled.  Select it.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh3.ggpht.com/_rhCtHYLiamQ/S4X61QZsRuI/AAAAAAABXMA/qqCrjdDTTBo/s800/15_test_results.jpg" alt="test results" /&gt;&lt;br /&gt;&lt;br /&gt;One final test...let's see if we can access these in the presentation layer.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_rhCtHYLiamQ/S4X8VqmAfHI/AAAAAAABXNI/GaydIpzQIB4/s800/17_presentation_variables.jpg" alt="success!" /&gt;&lt;br /&gt;&lt;br /&gt;So it's a success right?&lt;br /&gt;&lt;br /&gt;After I was done, I began to think..."You can access the repository variable from the presentation server"&lt;br /&gt;&lt;br /&gt;Ummm...that's not good.  Double checked the properties of both the Initialization Block and the Variables to see if there's a way to lock it down...and there's not.  Because of this "small" little security issue, I'm not completely sold.  It is a proof of concept, perhaps it should stay there.&lt;div class="blogger-post-footer"&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3853911845992923";/* atom feed */google_ad_slot = "1428191201";google_ad_width = 728;google_ad_height = 15;//--&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8884584404576003487-6397080347232898865?l=www.oraclenerd.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/6397080347232898865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8884584404576003487&amp;postID=6397080347232898865' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/6397080347232898865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/6397080347232898865'/><link rel='alternate' type='text/html' href='http://www.oraclenerd.com/2010/02/obiee-create-repository-init-block.html' title='OBIEE: Create Repository Init Block'/><author><name>oraclenerd</name><uri>http://www.blogger.com/profile/12412013306950057961</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03223434293565733241'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_rhCtHYLiamQ/S4X0MpmoNLI/AAAAAAABXIM/ahX4SAjD4Wk/s72-c/01_variable_manager.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8884584404576003487.post-8814375535991545151</id><published>2010-02-24T17:30:00.000-05:00</published><updated>2010-02-24T17:32:26.274-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='obiee'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><title type='text'>OBIEE: Text File as Data Source</title><content type='html'>I have a requirement to pull data from a text file.  OBI has the ability to pull from (just about) any database, but can it pull from a text file?  Of course.&lt;br /&gt;&lt;br /&gt;First I'll create a simple file, call it test.txt.  In the file I put&lt;pre class="code"&gt;cjustice testing&lt;/pre&gt;that "space" between cjustice and testing is actually a tab character (usually represented as -&gt; if you have view formatting turned on).  Knowing that it is a tab will be important shortly.  Save the file to your root folder, i.e. c:\test.txt&lt;br /&gt;&lt;br /&gt;Next up, go to your ODBC Datasources:&lt;br /&gt;&lt;br /&gt;Control Panel --&gt; Administrative Tools --&gt; Data Sources (ODBC) &lt;br /&gt;&lt;br /&gt;When that opens up, navigate to the System DSN tab and click on Add.&lt;br /&gt;&lt;br /&gt;You'll be prompted to choose a driver, select the Microsoft Text Driver (*.txt, *.csv)&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/_rhCtHYLiamQ/S4WdtlsZaNI/AAAAAAABXCg/uPYEVPyKRNQ/s800/01_create_new_data_source.jpg" alt="select driver" /&gt;&lt;br /&gt;&lt;br /&gt;Click on Finish.&lt;br /&gt;&lt;br /&gt;Next up, you should see the ODBC Text Setup screen, click on the Options tab to expand the window.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/_rhCtHYLiamQ/S4Wdu7OYqQI/AAAAAAABXDA/t7YWVDzEZIA/s800/02_odbc_text_setup.jpg" alt="options tab" /&gt;&lt;br /&gt;&lt;br /&gt;It should look like this:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh3.ggpht.com/_rhCtHYLiamQ/S4WduKElCXI/AAAAAAABXCo/GJyLuiOOx1E/s800/03_odbc_text_setup_expanded.jpg" alt="odbc text setup expanded" /&gt;&lt;br /&gt;&lt;br /&gt;Uncheck the Use Current Directory checkbox (default is usually c:\windows\system32):&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh3.ggpht.com/_rhCtHYLiamQ/S4WdvVpMkEI/AAAAAAABXDI/UJdgdm5r4qY/s800/04_odbc_text_setup_user_current_directory.jpg" alt="uncheck current directory" /&gt;&lt;br /&gt;&lt;br /&gt;Then select the Select Directory button and navigate to your root folder, or the place where you saved the test.txt file.  You should see your file, greyed out, in the left hand pane.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_rhCtHYLiamQ/S4WdvuQs6uI/AAAAAAABXDQ/-qU0aQ0wmVo/s800/05_odbc_select_directory.jpg" alt="select directory" /&gt;&lt;br /&gt;&lt;br /&gt;Now, at the bottom of the window, uncheck Default (*.*) which should enable the Define Format button&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/_rhCtHYLiamQ/S4Wdv8DEh6I/AAAAAAABXDY/tOHlL23rHWA/s800/06_odbc_default_format.jpg" alt="define format" /&gt;&lt;br /&gt;&lt;br /&gt;Select the Define Format.  For the Format drop down, choose Tab Delimited.  Rows to Scan, in my case, will only be 1.  You can leave it at the default if you want though.&lt;br /&gt;&lt;br /&gt;After you have done that, the Guess button should be enabled for you, go ahead and click it.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh3.ggpht.com/_rhCtHYLiamQ/S4WdwIxhbjI/AAAAAAABXDg/2i1-19apn4A/s800/08_odbc_guess.jpg" alt="define format step 1" /&gt;&lt;br /&gt;&lt;br /&gt;See F1 and F2?  Those are your columns.  Let's name them something meaningful so we can easily reference them later.&lt;br /&gt;&lt;br /&gt;In the Name box, it says F1, enter in USERNAME and click on Modify (the button to the right):&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_rhCtHYLiamQ/S4Wdw_dHb_I/AAAAAAABXDw/0m07z2UkG3Y/s800/09_odbc_define_format_username_column.jpg" alt="modify column name" /&gt;&lt;br /&gt;&lt;br /&gt;Do the same thing for the F2 column, name it PASSWORD.&lt;br /&gt;&lt;br /&gt;It should end up looking like this:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/_rhCtHYLiamQ/S4Wduj9diUI/AAAAAAABXC4/cRDc5MRDFCQ/s800/11_odbc_define_text_format_final.jpg" alt="final screen" /&gt;&lt;br /&gt;&lt;br /&gt;Select OK and then select OK again in the ODBC Text Setup screen.  You should now see your new data source in the System DSN window.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/_rhCtHYLiamQ/S4Wdwb4-iII/AAAAAAABXDo/UY1nIx1A59A/s800/12_odbc_text_test_entered.jpg" alt="system dsn" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;OBI EE Admin Tool&lt;/b&gt;&lt;br /&gt;Now, we need to pull this new data source into the RPD.  Open up your RPD, go to File --&gt; Import --&gt; from Database&lt;br /&gt;&lt;br /&gt;You'll see this window, go ahead and select your new data source:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh3.ggpht.com/_rhCtHYLiamQ/S4WnouwXjmI/AAAAAAABXGA/bbDVAEIVCTc/s800/01_select_data_source.jpg" alt="select data source" /&gt;&lt;br /&gt;&lt;br /&gt;You'll be prompted with the Import window, expand the c:\ drive and then find your file&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/_rhCtHYLiamQ/S4WnpNk32AI/AAAAAAABXGQ/_pW99-R7R2k/s800/03_select_file.jpg" alt="find file" /&gt;&lt;br /&gt;&lt;br /&gt;Select Import (at the bottom), wait for it to complete and then close the window.  In your physical layer you should see a new "database" with the name "text_test" (or whatever you named your data source).  Go ahead and expand that to see what you've got:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_rhCtHYLiamQ/S4WnpQ-pHVI/AAAAAAABXGY/rT4VfoSVVTo/s800/04_physical.jpg" alt="physical layer" /&gt;&lt;br /&gt;&lt;br /&gt;To verify, right click on the table "test.txt" and select View Data.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_rhCtHYLiamQ/S4WnoP3wtxI/AAAAAAABXF4/-2JiHstjCDU/s800/20_view_data.jpg" alt="view data" /&gt;&lt;br /&gt;&lt;br /&gt;All done.&lt;div class="blogger-post-footer"&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3853911845992923";/* atom feed */google_ad_slot = "1428191201";google_ad_width = 728;google_ad_height = 15;//--&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8884584404576003487-8814375535991545151?l=www.oraclenerd.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/8814375535991545151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8884584404576003487&amp;postID=8814375535991545151' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/8814375535991545151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/8814375535991545151'/><link rel='alternate' type='text/html' href='http://www.oraclenerd.com/2010/02/obiee-text-file-as-data-source.html' title='OBIEE: Text File as Data Source'/><author><name>oraclenerd</name><uri>http://www.blogger.com/profile/12412013306950057961</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03223434293565733241'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_rhCtHYLiamQ/S4WdtlsZaNI/AAAAAAABXCg/uPYEVPyKRNQ/s72-c/01_create_new_data_source.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8884584404576003487.post-6714804657130209534</id><published>2010-02-23T22:49:00.002-05:00</published><updated>2010-02-23T23:02:44.485-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='datawarehouse'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Connect to HP Neoview using Heterogenous Services</title><content type='html'>Being the lazy sort that I am and not wanting to pay for a SQL client, I decided to use my local Oracle instance to access a HP Neoview database.  Please don't ask me any questions about it, because like much of the world, I don't know either.&lt;br /&gt;&lt;br /&gt;Hat(s) off to Tak Tang.  I've used his &lt;a href="http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:4406709207206#18830681837358"&gt;guide&lt;/a&gt; a number of times throughout the years.  If he blogs, I can't find it, so if you know about it, please link him up.  The first time I used it was back in aught (sp?) 5 to connect to a DB2 instance.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Setup&lt;/b&gt;&lt;br /&gt;Database (source):  Oracle 10gR2&lt;br /&gt;OS:  Windows Vista Ultimate running as a VirtualBox Guest on Ubuntu&lt;br /&gt;Database (target):  HP Neoview 2.4 (or something)&lt;br /&gt;OS:  Doesn't matter&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Materials&lt;/b&gt;&lt;br /&gt;HP Neoview driver which can be found &lt;a href="http://software.hp.com/portal/swdepot/displayProductInfo.do?productNumber=NEO12"&gt;here&lt;/a&gt;.  (Thanks &lt;a href="http://twitter.com/nephentur"&gt;Christian&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Steps&lt;/b&gt;&lt;br /&gt;Download the HP Neoview driver and install it.  Since it is windows, just click away accepting all the defaults.&lt;br /&gt;&lt;br /&gt;Next, configure an ODBC Datasource.  I won't go into the gory details, but it's pretty easy.  When you are done, you should see something like this:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_rhCtHYLiamQ/S4RPfd4Y-qI/AAAAAAABW-g/R5dRCeI6EuE/s800/01_odbc_datasource.png" alt="ODBC Datasource" /&gt;&lt;br /&gt;&lt;br /&gt;Now comes the fun part.&lt;br /&gt;&lt;br /&gt;In your &amp;lt;ORACLE_HOME&amp;gt;\hs\admin directory you should see the following:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh3.ggpht.com/_rhCtHYLiamQ/S4RU-M7-ezI/AAAAAAABW_A/L8mSPlH4_Jo/s800/02_hs_folder.png" alt="HS Folder" /&gt;&lt;br /&gt;&lt;br /&gt;Open up the inithsodbc.ora file and set the parameters as follows:&lt;pre class="code"&gt;HS_FDS_CONNECT_INFO = NEOVIEW&lt;br /&gt;HS_FDS_TRACE_LEVEL = 1&lt;/pre&gt;Save the file as initNEOVIEW.ora in the same directory. &lt;br /&gt;&lt;br /&gt;Now traverse to &amp;lt;ORACLE_HOME&amp;gt;\network\admin and open up your listener.ora file.  Add a SID_DESC so that your file now looks like this:&lt;pre class="code"&gt;LISTENER=&lt;br /&gt;  (DESCRIPTION=&lt;br /&gt;    (ADDRESS_LIST=&lt;br /&gt;      (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))&lt;br /&gt;      (ADDRESS=(PROTOCOL=ipc)(KEY=extproc))))&lt;br /&gt;SID_LIST_LISTENER=&lt;br /&gt;  (SID_LIST=&lt;br /&gt;    (SID_DESC=&lt;br /&gt;      (GLOBAL_DBNAME=testing)&lt;br /&gt;      (ORACLE_HOME=c:\oracle)&lt;br /&gt;      (SID_NAME=testing))&lt;br /&gt;    (SID_DESC=&lt;br /&gt;      (SID_NAME=plsextproc)&lt;br /&gt;      (ORACLE_HOME=c:\oracle)&lt;br /&gt;      (PROGRAM=extproc))&lt;br /&gt;    (SID_DESC=&lt;br /&gt;      (SID_NAME=NEOVIEW)&lt;br /&gt;      (ORACLE_HOME=c:\oracle)&lt;br /&gt;      (PROGRAM=hsodbc)))&lt;/pre&gt;Reload or stop and start your listener.&lt;br /&gt;&lt;br /&gt;Now open up your tnsnames.ora file and add an entry for NEOVIEW.  It should look like this:&lt;pre class="code"&gt;NEOVIEW =&lt;br /&gt;  (DESCRIPTION=&lt;br /&gt;    (ADDRESS_LIST=&lt;br /&gt;      (ADDRESS=&lt;br /&gt;        (PROTOCOL=TCP)&lt;br /&gt;        (HOST=localhost)&lt;br /&gt;        (PORT=1521)&lt;br /&gt;      )&lt;br /&gt;    )&lt;br /&gt;    (CONNECT_DATA=(SID=NEOVIEW))&lt;br /&gt;    (HS=OK)&lt;br /&gt;  )&lt;/pre&gt;The last step is to create a database link.&lt;pre class="code"&gt;CREATE DATABASE LINK neoview&lt;br /&gt;  CONNECT TO "username"&lt;br /&gt;  IDENTIFIED BY "password"&lt;br /&gt;  USING 'NEOVIEW';&lt;/pre&gt;You should be all set now.  You can test it out by issueing a simple&lt;pre class="code"&gt;SELECT * FROM dual&lt;/pre&gt;If that works, you're done.&lt;br /&gt;&lt;br /&gt;If you have problems, check out Tak's Troubleshooting section.&lt;div class="blogger-post-footer"&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3853911845992923";/* atom feed */google_ad_slot = "1428191201";google_ad_width = 728;google_ad_height = 15;//--&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8884584404576003487-6714804657130209534?l=www.oraclenerd.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/6714804657130209534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8884584404576003487&amp;postID=6714804657130209534' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/6714804657130209534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/6714804657130209534'/><link rel='alternate' type='text/html' href='http://www.oraclenerd.com/2010/02/connect-to-hp-neoview-using.html' title='Connect to HP Neoview using Heterogenous Services'/><author><name>oraclenerd</name><uri>http://www.blogger.com/profile/12412013306950057961</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03223434293565733241'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_rhCtHYLiamQ/S4RPfd4Y-qI/AAAAAAABW-g/R5dRCeI6EuE/s72-c/01_odbc_datasource.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8884584404576003487.post-5234549792255092693</id><published>2010-02-22T22:08:00.003-05:00</published><updated>2010-02-22T22:48:02.693-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='obiee'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><title type='text'>OBIEE:  Call SAPurgeCacheByDatabase</title><content type='html'>So the reason I am investigating the ODBC Function extensions is that we are trying to tie this into our existing ETL process.  After load, and within a designated time frame, we'd like to clear the cache for a given set of tables.  Fortunately, all those tables exist in a single database.  Unfortunately, I'm wasting your time by putting these into separate posts.  :)&lt;br /&gt;&lt;br /&gt;First, nothing up my sleeve.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh3.ggpht.com/_rhCtHYLiamQ/S4NIp3UsAoI/AAAAAAABW6Y/SuMSlNBiZbA/s800/01_obiee_clear_cache.png" alt="cache is cleared" /&gt;&lt;br /&gt;&lt;br /&gt;So you understand the mapping, I made a pretty picture for that (it's not readily available in the cache manager)&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/_rhCtHYLiamQ/S4NMac8AISI/AAAAAAABW7A/34kGNwr7Gns/s800/07_obiee_mapping.png" alt="mapped RPD" /&gt;&lt;br /&gt;&lt;br /&gt;I go off and run the reports (no need for screenshots of those).&lt;br /&gt;&lt;br /&gt;Refresh the cache manager&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh3.ggpht.com/_rhCtHYLiamQ/S4NIqBULO5I/AAAAAAABW6c/SjfG3R8domE/s800/02_obiee_cache_full.png" alt="cache full!" /&gt;&lt;br /&gt;&lt;br /&gt;So now I have cache entries for both "databases" (in quotes because they are actually the same physical database, just 2 separate connections).&lt;br /&gt;&lt;br /&gt;I then create the SQL file and put the following:&lt;pre class="code"&gt;CALL SAPurgeCacheByDatabase( 'local-sh' );&lt;/pre&gt;Then I just follow the same procedure as &lt;a href="http://www.oraclenerd.com/2010/02/obiee-call-sapurgeallcache.html"&gt;SAPurgeCacheAll()&lt;/a&gt;&lt;pre class="code"&gt;nqcmd -d AnalyticsWeb -u Administrator -p Administrator -s sapurgecachebydatabase.sql&lt;/pre&gt;The output is almost identical as well&lt;pre class="code"&gt;-------------------------------------------------------------------------------&lt;br /&gt;          Oracle BI Server&lt;br /&gt;          Copyright (c) 1997-2009 Oracle Corporation, All rights reserved&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;CALL SAPurgeCacheByDatabase( 'local-sh' )&lt;br /&gt;CALL SAPurgeCacheByDatabase( 'local-sh' )&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;------------------------------&lt;br /&gt;RESULT_CODE  RESULT_MESSAGE&lt;br /&gt;&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;------------------------------&lt;br /&gt;1            [59118] Operation SAPurgeCacheByDatabase succeeded!&lt;br /&gt;&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;------------------------------&lt;br /&gt;Row count: 1&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;------------------------------&lt;br /&gt;&lt;br /&gt;Processed: 1 queries&lt;/pre&gt;And voila!  The Sales cache has been cleared.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/_rhCtHYLiamQ/S4NPr-g2cqI/AAAAAAABW70/P7_AjtoCFkk/s800/08_obiee_cache_cleared.png" alt="cache cleared!" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3853911845992923";/* atom feed */google_ad_slot = "1428191201";google_ad_width = 728;google_ad_height = 15;//--&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8884584404576003487-5234549792255092693?l=www.oraclenerd.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/5234549792255092693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8884584404576003487&amp;postID=5234549792255092693' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/5234549792255092693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/5234549792255092693'/><link rel='alternate' type='text/html' href='http://www.oraclenerd.com/2010/02/obiee-call-sapurgecachebydatabase.html' title='OBIEE:  Call SAPurgeCacheByDatabase'/><author><name>oraclenerd</name><uri>http://www.blogger.com/profile/12412013306950057961</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03223434293565733241'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_rhCtHYLiamQ/S4NIp3UsAoI/AAAAAAABW6Y/SuMSlNBiZbA/s72-c/01_obiee_clear_cache.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8884584404576003487.post-8837040113756706625</id><published>2010-02-22T11:58:00.003-05:00</published><updated>2010-02-22T12:18:39.466-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='obiee'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><title type='text'>OBIEE:  Call SAPurgeAllCache()</title><content type='html'>Just a note to myself on how to clear the entire BI Server cache.&lt;br /&gt;&lt;br /&gt;Mr. Minkjan has a great article &lt;a href="http://obiee101.blogspot.com/2008/03/obiee-manage-cache-part-1.html"&gt;here&lt;/a&gt; and Gerard Nico has one &lt;a href="http://gerardnico.com/wiki/dat/obiee/bi_server/cache/obiee_purging_query_cache"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Caching has been enabled (via &amp;lt;BI_SERVER_HOME&amp;gt;\server\Config\NQSConfig.ini)&lt;br /&gt;&lt;br /&gt;For a list of ODBC Function extensions, read &lt;a href="http://download.oracle.com/docs/cd/E12103_01/books/admintool/admintool_QueryCaching6.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;First up, I run a simple report and then verify that there is an entry in the cache&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/Ow_g0N1zyl28SLdbQ9A-Cg?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_rhCtHYLiamQ/S4K5KR5eZ3I/AAAAAAABW14/TPDs9iPHWmw/s800/01_obiee_cache_exists.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I then create a small SQL script and put it in my c:\ folder:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/7sWSXKmbWj7BOtyYLQRJ-A?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_rhCtHYLiamQ/S4K5KTBCKiI/AAAAAAABW18/kwvBH0bbhX8/s800/02_obiee_call_sapurgeallcache.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(OK, just ignore what it says in the Title bar, I moved it)&lt;br /&gt;&lt;br /&gt;Open up a cmd prompt and issue the following:&lt;pre class="code"&gt;nqcmd -d AnalyticsWeb -u Administrator -p Administrator -s purgeallcache.sql&lt;/pre&gt;Hit enter and you should see the following:&lt;pre class="code"&gt;-------------------------------------------------------------------------------&lt;br /&gt;          Oracle BI Server&lt;br /&gt;          Copyright (c) 1997-2009 Oracle Corporation, All rights reserved&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;CALL SAPurgeAllCache()&lt;br /&gt;&lt;br /&gt;CALL SAPurgeAllCache()&lt;br /&gt;&lt;br /&gt;------------------------------------------------------------------------------------------------------&lt;br /&gt;------------------------------------------------------------------------------------------------------&lt;br /&gt;------------------------------&lt;br /&gt;RESULT_CODE  RESULT_MESSAGE&lt;br /&gt;&lt;br /&gt;------------------------------------------------------------------------------------------------------&lt;br /&gt;------------------------------------------------------------------------------------------------------&lt;br /&gt;------------------------------&lt;br /&gt;1            [59118] Operation SAPurgeAllCache succeeded!&lt;br /&gt;&lt;br /&gt;------------------------------------------------------------------------------------------------------&lt;br /&gt;------------------------------------------------------------------------------------------------------&lt;br /&gt;------------------------------&lt;br /&gt;Row count: 1&lt;br /&gt;------------------------------------------------------------------------------------------------------&lt;br /&gt;------------------------------------------------------------------------------------------------------&lt;br /&gt;------------------------------&lt;br /&gt;&lt;br /&gt;Processed: 1 queries&lt;/pre&gt;Check the Cache Manager and voila!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/m_uCKg60nh8dFyoUSYhL5Q?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_rhCtHYLiamQ/S4K77yRz6nI/AAAAAAABW3E/719rPkHhAus/s800/03_obiee_cache_cleared.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For future reference, here are the options available for the nqcmd utility:&lt;pre class="code"&gt;Command: nqcmd - a command line client which can issue SQL statements&lt;br /&gt;                 against either Oracle BI server or a variety&lt;br /&gt;                 of ODBC compliant backend databases.&lt;br /&gt;SYNOPSIS&lt;br /&gt;         nqcmd [OPTION]...&lt;br /&gt;DESCRIPTION&lt;br /&gt;         -d&lt;data source name&gt;&lt;br /&gt;         -u&lt;user name&gt;&lt;br /&gt;         -p&lt;password&gt;&lt;br /&gt;         -s&lt;sql input file name&gt;&lt;br /&gt;         -o&lt;output result file name&gt;&lt;br /&gt;         -D&lt;Delimiter&gt;&lt;br /&gt;         -C&lt;# number of fetched rows by column-wise binding&gt;&lt;br /&gt;         -R&lt;# number of fetched rows by row-wise binding&gt;&lt;br /&gt;         -a (a flag to enable async processing)&lt;br /&gt;         -f (a flag to enable to flush output file for each write)&lt;br /&gt;         -H (a flag to enable to open/close a request handle for each query)&lt;br /&gt;         -z (a flag to enable UTF8 instead of ACP)&lt;br /&gt;         -utf16 (a flag to enable UTF16 instead of ACP)&lt;br /&gt;         -q (a flag to turn off row output)&lt;br /&gt;         -NoFetch (a flag to disable data fetch with query execution)&lt;br /&gt;         -NotForwardCursor (a flag to disable forwardonly cursor)&lt;br /&gt;         -SessionVar &lt;SessionVarName&gt;=&lt;SessionVarVAlue&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3853911845992923";/* atom feed */google_ad_slot = "1428191201";google_ad_width = 728;google_ad_height = 15;//--&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8884584404576003487-8837040113756706625?l=www.oraclenerd.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/8837040113756706625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8884584404576003487&amp;postID=8837040113756706625' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/8837040113756706625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/8837040113756706625'/><link rel='alternate' type='text/html' href='http://www.oraclenerd.com/2010/02/obiee-call-sapurgeallcache.html' title='OBIEE:  Call SAPurgeAllCache()'/><author><name>oraclenerd</name><uri>http://www.blogger.com/profile/12412013306950057961</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03223434293565733241'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_rhCtHYLiamQ/S4K5KR5eZ3I/AAAAAAABW14/TPDs9iPHWmw/s72-c/01_obiee_cache_exists.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8884584404576003487.post-4488080983708621616</id><published>2010-02-21T23:12:00.003-05:00</published><updated>2010-02-22T09:07:35.801-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql developer'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='soug'/><title type='text'>SOUG:  SQL Developer Unit Testing</title><content type='html'>This week the Suncoast Oracle Users Group will be hosting &lt;a href="http://www.linkedin.com/profile?viewProfile=&amp;key=2249004&amp;authToken=-nmC&amp;authType=NAME_SEARCH&amp;locale=en_US&amp;srchindex=1&amp;pvs=ps&amp;goback=.fps_syme+kutz_*1_*1_*1_*1_*1_*1_*1_Y_*1_*1_*1_false_1_R_true_CC%2CN%2CI%2CG%2CPC%2CED%2CFG%2CL%2CDR_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2"&gt;Syme Kutz&lt;/a&gt;, Senior Architect for Database Tools at Oracle.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update&lt;/b&gt;&lt;br /&gt;I received Syme's bio (from Syme of course).  It's pretty impressive...&lt;blockquote&gt;I started working at Oracle in October of 1995 in the Systems Performance Group of Consulting under Cary Millsap.&lt;br /&gt;&lt;br /&gt;I then spent 8 years tuning the Database and Oracle Applications. My Experience tuning application lead me to work with Max Schierson fixing and Tuning iStore. I left consulting and moved into Applications It working for Max at Headquarters were our focus was building custom applications to better facilitate oracle policies and programs.  I built custom applications until a position opened up on APEX the development team. After rebuilding the Database management side of APEX, Kris Rice and I began the Sql Developer project. When the group split and Sql Developer became a product I followed. I have been a developer on Sql Developer since then building various functionality, such as reports and Unti Testing.&lt;/blockquote&gt;We "found" Syme through Kris Rice who unceremoniously offered his services up on Twitter.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/krisrice/status/6437160228"&gt;&lt;img src="http://lh4.ggpht.com/_rhCtHYLiamQ/S4IF3L1tMNI/AAAAAAABWzk/Wd9jDyVxf_c/s800/doodle.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After much wrangling and negotiating, we finally managed to talk Syme into coming down from Orlando.&lt;br /&gt;&lt;br /&gt;According to Kris, Syme was heavily involved with the new Unit Testing functionality of SQL Developer.  We all know how much testing us database folks do, so it makes perfect sense right? &lt;br /&gt;&lt;br /&gt;Anyway, if you're in town and Thursday, please come by and check out Syme's presentation, it should be very interesting.&lt;div class="blogger-post-footer"&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3853911845992923";/* atom feed */google_ad_slot = "1428191201";google_ad_width = 728;google_ad_height = 15;//--&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8884584404576003487-4488080983708621616?l=www.oraclenerd.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/4488080983708621616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8884584404576003487&amp;postID=4488080983708621616' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/4488080983708621616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/4488080983708621616'/><link rel='alternate' type='text/html' href='http://www.oraclenerd.com/2010/02/soug-sql-developer-unit-testing.html' title='SOUG:  SQL Developer Unit Testing'/><author><name>oraclenerd</name><uri>http://www.blogger.com/profile/12412013306950057961</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03223434293565733241'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_rhCtHYLiamQ/S4IF3L1tMNI/AAAAAAABWzk/Wd9jDyVxf_c/s72-c/doodle.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8884584404576003487.post-3718026415015247115</id><published>2010-02-21T18:17:00.003-05:00</published><updated>2010-02-21T18:33:27.588-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='oltp'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Database Application Security - A Visualization</title><content type='html'>Security, in regards to the database, is pretty broad.  There are a multitude of ways to secure your database.  From physical or logical access to SQL Injection.&lt;br /&gt;&lt;br /&gt;This is a (not so) pretty picture of how I visualize security from an application point of view.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh3.ggpht.com/_rhCtHYLiamQ/S4G--fN07TI/AAAAAAABWx0/DoZ_5_ycZYI/s800/secure_oltp.png" alt="Secure OLTP Application" /&gt;&lt;br /&gt;&lt;br /&gt;The base of any application are the tables.  Access to those tables should be limited to database views and PL/SQL packages (API) that are owned by the application (schema).&lt;br /&gt;&lt;br /&gt;SELECT privileges on those views should be given to only users who need it (users also includes other applications).  Views present the data in the format that is required by the application.  VPD (column or row) can be used to further restrict access to sensitive data.&lt;br /&gt;&lt;br /&gt;EXECUTE privileges on the APIs (PL/SQL) should only be given to those applications that need it.  &lt;b&gt;Under no circumstances&lt;/b&gt;, should direct INSERT/UPDATE/DELETE privileges be given to another user.&lt;br /&gt;&lt;br /&gt;Much of my thoughts on this matter are directly traceable to reading AskTom for so many years.  I can't point to any one specific article, I think it's the accumulation/internalization of reading for so long.&lt;br /&gt;&lt;br /&gt;It makes sense though.&lt;br /&gt;&lt;br /&gt;Who better to decide the functions (INSERT/UPDATE/DELETE) that can be performed against a given set of tables than the person(s) who created them?  If said person has left, make someone else responsible for them.  I've fought hard over the years to implement this "pattern" and have been fairly unsuccessful.  It is difficult to go against years of doing it one way (full access to the underlying tables) to forcing someone or something to use the API.&lt;br /&gt;&lt;br /&gt;The idea to visualize it came to me recently and I need to put it down.&lt;br /&gt;&lt;br /&gt;What do you think?  Am I full of it?  Is this reasonable?  Anything I left out?&lt;div class="blogger-post-footer"&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3853911845992923";/* atom feed */google_ad_slot = "1428191201";google_ad_width = 728;google_ad_height = 15;//--&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8884584404576003487-3718026415015247115?l=www.oraclenerd.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/3718026415015247115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8884584404576003487&amp;postID=3718026415015247115' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/3718026415015247115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/3718026415015247115'/><link rel='alternate' type='text/html' href='http://www.oraclenerd.com/2010/02/database-application-security.html' title='Database Application Security - A Visualization'/><author><name>oraclenerd</name><uri>http://www.blogger.com/profile/12412013306950057961</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03223434293565733241'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_rhCtHYLiamQ/S4G--fN07TI/AAAAAAABWx0/DoZ_5_ycZYI/s72-c/secure_oltp.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8884584404576003487.post-565594602814219717</id><published>2010-02-17T23:10:00.002-05:00</published><updated>2010-02-17T23:28:41.868-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='obiee'/><title type='text'>OBIEE:  Usage Tracking Performance Improvements</title><content type='html'>Usage Tracking, in OBIEE, allows you to capture some basic statistics on your Presentation layer.&lt;br /&gt;&lt;br /&gt;I mused &lt;a href="http://www.oraclenerd.com/2010/02/random-things-volume-13.html"&gt;recently &lt;/a&gt;about diving into the "internals" of OBIEE, specifically learning how to read the logs (Execution Plans) and other stuff.&lt;br /&gt;&lt;br /&gt;Mr. &lt;a href="http://www.rittmanmead.com/blog/"&gt;Mark Rittma&lt;/a&gt;n was kind enough to share his thoughts on the matter in the comment section.  I'm reposting here because I believe it is valuable insight.&lt;blockquote&gt;Regarding the thoughts on OBIEE performance. Here's my thinking on the subject.&lt;br /&gt;&lt;br /&gt;When I found out about concepts such as OBIEE "driving tables", level 5 logging and BI Server execution plans, my first reaction was to try and dissect them, try and understand them in the same way that I understand the various types of Oracle joins (hash/nested loop etc), Oracle trace files, 10035 traces etc. At the end of the day the BI Server is a virtual database engine and it makes sense to understand and tune it in the same way that we do with Oracle.&lt;br /&gt;&lt;br /&gt;But then, the reality is, if you are spending time understanding level 5 log files, the various federated query optimization techniques, to be honest you'd be better off trying to optimize the underlying data so that the BI Server didn't then have to use these features.&lt;br /&gt;&lt;br /&gt;For example - if you're trying to optimize a federated query, you should try and co-locate the data instead, either by copying both data sets to the same physical database, or better still, combine them into a data mart or warehouse. If you are having problems with aggregation and start thinking about the Aggregate Persistence Wizard - well you'd be better off putting the data into Essbase instead, and run OBIEE against that rather than your detail-level database.&lt;br /&gt;&lt;br /&gt;And so on. So whilst it's interesting to see how the internals of the BI Server work, how it joins data, how you can optimize cross-database joins etc, in the end this is more from the intellectual angle, as you get far more "bang for your buck" by sorting out the data layer away from OBIEE and then bring a more optimized set of data into the BI Server. "Less is more" is my perspective with OBIEE, and the more that we can do at the (Oracle) database or (Essbase) OLAP server end, and keep the BI Server model simple, is the better in my book.&lt;br /&gt;&lt;br /&gt;Just my 0.02&lt;/blockquote&gt;That last paragraph is key.  Push the data into the database and keep the OBIEE model simple.  Sounds right up my alley!&lt;br /&gt;&lt;br /&gt;With Mr. Rittman's comments swirling in my head, I went about my performance tuning a bit differently.&lt;br /&gt;&lt;br /&gt;We added some user tables to the Usage Tracking model, which seem to bring the performance to a screeching halt.  A halt is defined at about a minute or so for the complete page to render...well, the page renders, I guess I mean the queries to return.&lt;br /&gt;&lt;br /&gt;Here's essentially what it looks like:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh3.ggpht.com/_rhCtHYLiamQ/S3y9lDdmy2I/AAAAAAABWvU/uu4KAKG0I0U/s800/setup.png" alt="Usage Tracking Setup" /&gt;&lt;br /&gt;&lt;br /&gt;Two databases and three separate schemas.&lt;br /&gt;&lt;br /&gt;The very first thing I did was limit the number of rows returned to the BI Server from S_NQ_ACCT.  Looking at the data more closely, it was pulling in more than just the reports, it had stats for ValuePrompts and Filters as well.  Those weren't needed.  I created a view on top of S_NQ_ACCT which returned about a quarter of the records.  For perspective, I'm dealing with about 400K records.&lt;br /&gt;&lt;br /&gt;Added that to the Physical Layer (File --&gt; Import --&gt; From Database) then updated the sources.&lt;br /&gt;&lt;br /&gt;Ran the offending page...no difference.&lt;br /&gt;&lt;br /&gt;Looking at the logs, I can see 4 queries being sent to the 2 databases.  It appears that OBIEE won't push the join to the database if using separate connection pools.  After thinking about it, it made perfect sense, OBIEE can't assume that each connection has the same privileges as the other.  (Though I cannot confirm that yet, just seems logical).&lt;br /&gt;&lt;br /&gt;Next, I pulled the data from Schema 2 into Schema 1.&lt;br /&gt;&lt;br /&gt;Ran the page, no difference.&lt;br /&gt;&lt;br /&gt;Checked the logs, and there were still 4 queries sent to the 2 databases.  To be fair, I may have run the page prior to the changes being propogated to the BI Server.&lt;br /&gt;&lt;br /&gt;OK...let's pull the data from DB 2 and see what happens.  Import the table, configure everything.&lt;br /&gt;&lt;br /&gt;Ran the page, no difference.&lt;br /&gt;&lt;br /&gt;Looking at the logs this time, I saw 3 queries.  Better right?&lt;br /&gt;&lt;br /&gt;For fun, I decided to put the results of Query 2 and Query 3 into a table.  Configured everything...blah blah blah.&lt;br /&gt;&lt;br /&gt;Ran the page, it can up almost immediately.  I called 2 people and had them run the same report and they saw the same behavior.  Win!  (Caching is &lt;b&gt;not&lt;/b&gt; turned on in this environment).&lt;br /&gt;&lt;br /&gt;When I looked at the log, a single query was sent to the database.  It was an ugly query, but the joins took place in the database as opposed to the BI Server.  &lt;br /&gt;&lt;br /&gt;This won't be the final implementation, I'll probably have to back out these changes.  But it's a great proof of concept.&lt;div class="blogger-post-footer"&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;&lt;!--google_ad_client = "pub-3853911845992923";/* atom feed */google_ad_slot = "1428191201";google_ad_width = 728;google_ad_height = 15;//--&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8884584404576003487-565594602814219717?l=www.oraclenerd.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/565594602814219717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8884584404576003487&amp;postID=565594602814219717' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/565594602814219717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8884584404576003487/posts/default/565594602814219717'/><link rel='alternate' type='text/html' href='http://www.oraclenerd.com/2010/02/obiee-usage-tracking-performance.html' title='OBIEE:  Usage Tracking Performance Improvements'/><author><name>oraclenerd</name><uri>http://www.blogger.com/profile/12412013306950057961</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03223434293565733241'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_rhCtHYLiamQ/S3y9lDdmy2I/AAAAAAABWvU/uu4KAKG0I0U/s72-c/setup.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>