<rss version="2.0"><channel><title>RSS feed for InstantSpot site fro</title><link>http://fro.instantspot.com</link><description>Just playing around.</description><language>en-us</language><copyright>This work is Copyright &#xA9; 2008 by fro</copyright><generator>RSSVille ColdFusion FeedMaker, version 1.0</generator><pubDate>Fri, 05 Sep 2008 16:39:25 GMT</pubDate><item><title>Oracle - Close Your Cursors</title><link>http://fro.instantspot.com/blog/2006/11/02/Oracle--Close-Your-Cursors</link><description>&lt;p&gt;
Be sure to close all of your cursors. I&amp;#39;m not a big fan of cursors, but they are useful some of the time.
&lt;/p&gt;
&lt;p&gt;
I added a slightly altered version of the join UDF, &lt;a href=&quot;http://builder.com.com/5100-6388_14-5259821.html#Table%20A&quot; target=&quot;_blank&quot;&gt;found here&lt;/a&gt; , to my Oracle box today. When I ran the first test, it ran great. Then I went to run it with a larger result set and it bombed. The error returned was:
&lt;/p&gt;
&lt;p&gt;
&lt;font face=&quot;courier new,courier&quot; size=&quot;2&quot; color=&quot;#990000&quot;&gt;ORA-01000: maximum open cursors exceeded&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
So I looked at the function a little closer, and realized that it was leaving the cursors open. So I added the following line after the end loop:
&lt;/p&gt;
&lt;p&gt;
&lt;font face=&quot;courier new,courier&quot; size=&quot;2&quot; color=&quot;#990000&quot;&gt;CLOSE p_cursor;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Now everything works great!&amp;nbsp;
&lt;/p&gt;
</description><pubDate>Thu, 02 Nov 2006 18:24:44 GMT</pubDate><guid>http://fro.instantspot.com/blog/2006/11/02/Oracle--Close-Your-Cursors</guid><category>oracle</category></item><item><title>Oracle - Compare a List to a List</title><link>http://fro.instantspot.com/blog/2006/10/26/Oracle--Compare-a-List-to-a-List</link><description>&lt;p&gt;
Today I came across an issue where I needed to compare one list to another in Oracle before I could return the result set. One list is in a column of the table that I want to return. The other list is going to be passed in. I want the row returned if any value in the first list matches any value in the second. After doing a bit of searching, this is what I came up with.
&lt;/p&gt;
&lt;p&gt;
I thought that it would be easier to work with the list if I could mutate it into it&amp;#39;s own table. A friend of mine created a listToTable function in MS SQL Server a while back, so I knew there had to be an Oracle version out there. So I found &lt;a href=&quot;http://builder.com.com/5100-6388_14-5259821.html&quot; target=&quot;_blank&quot;&gt;this link&lt;/a&gt;  , which I&amp;#39;ve modified slightly below.
&lt;/p&gt;
&lt;p&gt;
&lt;font face=&quot;courier new,courier&quot; size=&quot;2&quot; color=&quot;#990000&quot;&gt;/* you must first create a type for the returned table */&lt;br /&gt;
CREATE OR REPLACE TYPE split_table AS TABLE OF VARCHAR2(32767);&lt;br /&gt;
&lt;br /&gt;
/* now we create the actual function */&lt;br /&gt;
CREATE OR REPLACE FUNCTION udf_split&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nList VARCHAR2,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nDelim VARCHAR2 := &amp;#39;,&amp;#39;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ) RETURN split_table PIPELINED&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; IS&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wID PLS_INTEGER;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wList VARCHAR2(32767) := nList;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wValue VARCHAR2(32767);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOOP&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wID := INSTR(wList,nDelim);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF wID &amp;gt; 0 THEN&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIPE ROW(SUBSTR(wList, 1, wID - 1));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wList := SUBSTR(wList, wID + LENGTH(nDelim));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIPE ROW(wList);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EXIT;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END LOOP;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; RETURN;&lt;br /&gt;
END udf_split;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
From my understanding VARCHAR2(32767) is the largest varchar field you can have.
&lt;/p&gt;
&lt;p&gt;
Now we have to create the package that we&amp;#39;re going to call to get our results. This package will contain the procedure that will take in one list and compare it to another using the udf_split function twice.
&lt;/p&gt;
&lt;p&gt;
&lt;font face=&quot;courier new,courier&quot; size=&quot;2&quot; color=&quot;#990000&quot;&gt;/* first we create the package */&lt;br /&gt;
CREATE PACKAGE upk_test&lt;br /&gt;
AS&lt;br /&gt;
&amp;nbsp; TYPE cursor_type IS REF CURSOR;&lt;br /&gt;
&amp;nbsp; PROCEDURE getResults(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; pList IN VARCHAR2,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; pResults OUT cursor_type);&lt;br /&gt;
END upk_test;&lt;br /&gt;
&lt;br /&gt;
/* then we create the package body */&lt;br /&gt;
CREATE OR REPLACE PACKAGE BODY upk_test&lt;br /&gt;
AS&lt;br /&gt;
&amp;nbsp; PROCEDURE getResults(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; pList IN VARCHAR2,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; pResults OUT cursor_type)&lt;br /&gt;
&amp;nbsp; IS&lt;br /&gt;
&amp;nbsp; BEGIN&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; OPEN pResults FOR&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT *&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM (&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT a.*,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CASE WHEN a.list_a IS NOT NULL THEN (&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT COUNT(*)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM TABLE(CAST(udf_split(a.list_a) AS split_table)) b&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INNER JOIN TABLE(CAST(udf_split(pList) AS split_table)) c&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ON b.column_value = c.column_value)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE 0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END AS allowed&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM my_table a) d&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE d.allowed &amp;gt; 0;&lt;br /&gt;
&amp;nbsp; END;&lt;br /&gt;
END upk_menu;&lt;/font&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
Now you can call the procedure for ColdFusion as such:&lt;br /&gt;
&lt;font face=&quot;courier new,courier&quot; size=&quot;2&quot; color=&quot;#990000&quot;&gt;&lt;br /&gt;
&amp;lt;cfstoredproc datasource=&amp;quot;#myDSN#&amp;quot; procedure=&amp;quot;upk_test.getResults&amp;quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;cfprocparam cfsqltype=&amp;quot;cf_sql_varchar&amp;quot; dbvarname=&amp;quot;pList&amp;quot; value=&amp;quot;#someList#&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;cfprocresult name=&amp;quot;menu&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/cfstoredproc&amp;gt;&lt;br /&gt;
&lt;/font&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
The above takes in a list like &amp;quot;1,3,7&amp;quot; and compares it to the list column of a table like:
&lt;/p&gt;
&lt;table border=&quot;0&quot;&gt;
	&lt;tbody&gt;
		&lt;tr align=&quot;center&quot; style=&quot;border: 1px solid #000000; background-color: #dddddd&quot;&gt;
			&lt;td&gt; ID&lt;/td&gt;
			&lt;td&gt;SOMETHING &lt;br /&gt;
			&lt;/td&gt;
			&lt;td&gt;LIST &lt;br /&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr align=&quot;center&quot; style=&quot;border: 1px solid #000000; background-color: #dddddd&quot;&gt;
			&lt;td&gt;1 &lt;br /&gt;
			&lt;/td&gt;
			&lt;td&gt;do &lt;br /&gt;
			&lt;/td&gt;
			&lt;td&gt;2 &lt;br /&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr align=&quot;center&quot; style=&quot;border: 1px solid #000000; background-color: #dddddd&quot;&gt;
			&lt;td&gt;2 &lt;br /&gt;
			&lt;/td&gt;
			&lt;td&gt;go &lt;br /&gt;
			&lt;/td&gt;
			&lt;td&gt;3,6,8 &lt;br /&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr align=&quot;center&quot; style=&quot;border: 1px solid #000000; background-color: #dddddd&quot;&gt;
			&lt;td&gt;3 &lt;br /&gt;
			&lt;/td&gt;
			&lt;td&gt;say &lt;br /&gt;
			&lt;/td&gt;
			&lt;td&gt;7 &lt;br /&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
Since rows 2 and 3 have a match to the input list, the package will return the following result set:
&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;2&quot; cellpadding=&quot;1&quot; style=&quot;border: 0pt solid #000000&quot;&gt;
	&lt;tbody&gt;
		&lt;tr style=&quot;background-color: #dddddd&quot;&gt;
			&lt;td&gt;ID &lt;/td&gt;
			&lt;td&gt;SOMETHING &lt;br /&gt;
			&lt;/td&gt;
			&lt;td&gt;LIST &lt;br /&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr style=&quot;background-color: #dddddd&quot;&gt;
			&lt;td&gt;2 &lt;br /&gt;
			&lt;/td&gt;
			&lt;td&gt;go &lt;br /&gt;
			&lt;/td&gt;
			&lt;td&gt;3,6,8 &lt;br /&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr style=&quot;background-color: #dddddd&quot;&gt;
			&lt;td&gt;3 &lt;br /&gt;
			&lt;/td&gt;
			&lt;td&gt;say &lt;br /&gt;
			&lt;/td&gt;
			&lt;td&gt;7 &lt;br /&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
What do you think?  Is this a long way of going about what I&amp;#39;m trying to do? I would imagine that a good REGEXP would do the trick, but I&amp;#39;m not that good with REGEXP.
&lt;/p&gt;
&lt;p&gt;
Anyone? 
&lt;/p&gt;
</description><pubDate>Thu, 26 Oct 2006 20:40:43 GMT</pubDate><guid>http://fro.instantspot.com/blog/2006/10/26/Oracle--Compare-a-List-to-a-List</guid><category>oracle</category></item><item><title>Friday</title><link>http://fro.instantspot.com/blog/2006/09/15/Friday</link><description>&lt;p&gt;
&lt;font face=&quot;arial,helvetica,sans-serif&quot; size=&quot;2&quot;&gt;Well, it&amp;#39;s Friday.&amp;nbsp; Thank goodness for that.&lt;/font&gt; 
&lt;/p&gt;
</description><pubDate>Fri, 15 Sep 2006 19:54:35 GMT</pubDate><guid>http://fro.instantspot.com/blog/2006/09/15/Friday</guid></item></channel></rss>