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

<channel>
	<title>info.michael-simons.eu &#187; PL/SQL</title>
	<atom:link href="http://info.michael-simons.eu/tag/plsql/feed/" rel="self" type="application/rss+xml" />
	<link>http://info.michael-simons.eu</link>
	<description>Just another nerd blog</description>
	<lastBuildDate>Tue, 07 Sep 2010 09:00:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Oracle &#8220;sleep&#8221; procedure: DBMS_LOCK.SLEEP</title>
		<link>http://info.michael-simons.eu/2010/09/07/oracle-sleep-procedure-dbms_lock-sleep/</link>
		<comments>http://info.michael-simons.eu/2010/09/07/oracle-sleep-procedure-dbms_lock-sleep/#comments</comments>
		<pubDate>Tue, 07 Sep 2010 09:00:01 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[English posts]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[DBMS_LOCK]]></category>
		<category><![CDATA[PL/SQL]]></category>

		<guid isPermaLink="false">http://info.michael-simons.eu/?p=440</guid>
		<description><![CDATA[There&#8217;s a nice little &#8220;sleep&#8221; procedure in Oracle: A procedure that stops the execution of the current thread for n seconds. Strangely, this method can be called in SQL*Plus like so: exec dbms_lock.sleep&#40;10&#41;; but not in another stored procedure or function like so CREATE OR REPLACE PROCEDURE FOOBAR AS BEGIN DBMS_LOCK.SLEEP&#40;1&#41;; END; / To use [...]]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s a nice little &#8220;sleep&#8221; procedure in Oracle: A procedure that stops the execution of the current thread for n seconds.</p>
<p>Strangely, this method can be called in SQL*Plus like so:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">exec dbms_lock<span style="color: #66cc66;">.</span>sleep<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>but not in another stored procedure or function like so</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #993333; font-weight: bold;">REPLACE</span> PROCEDURE FOOBAR <span style="color: #993333; font-weight: bold;">AS</span>
BEGIN
  DBMS_LOCK<span style="color: #66cc66;">.</span>SLEEP<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
END;
<span style="color: #66cc66;">/</span></pre></div></div>

<p>To use &#8220;sleep&#8221; in your procedures or functions, login as administrator to your database (or ask you admin to to so) and create the following objects:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #993333; font-weight: bold;">REPLACE</span> PROCEDURE sleep<span style="color: #66cc66;">&#40;</span>seconds NUMBER<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span>
BEGIN
  DBMS_LOCK<span style="color: #66cc66;">.</span>SLEEP<span style="color: #66cc66;">&#40;</span>seconds<span style="color: #66cc66;">&#41;</span>;
END;
<span style="color: #66cc66;">/</span>
&nbsp;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #993333; font-weight: bold;">REPLACE</span> public synonym sleep <span style="color: #993333; font-weight: bold;">FOR</span> sleep;
&nbsp;
<span style="color: #993333; font-weight: bold;">GRANT</span> execute <span style="color: #993333; font-weight: bold;">ON</span> sleep <span style="color: #993333; font-weight: bold;">TO</span> public;</pre></div></div>

<p>and in your procedure just use &#8220;sleep&#8221;.</p>
<p class="akst_link"><a href="http://info.michael-simons.eu/?p=440&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_440" class="akst_share_link " rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://info.michael-simons.eu/2010/09/07/oracle-sleep-procedure-dbms_lock-sleep/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fun with sql</title>
		<link>http://info.michael-simons.eu/2008/10/27/fun-with-sql/</link>
		<comments>http://info.michael-simons.eu/2008/10/27/fun-with-sql/#comments</comments>
		<pubDate>Mon, 27 Oct 2008 08:47:30 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[English posts]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[PL/SQL]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://info.michael-simons.eu/?p=221</guid>
		<description><![CDATA[What&#8217;s all the fuss about this SQL Injection thing? It boils down getting some malicious crafted SQL code into the SQL code of an application, destroying data or authenticate yourself without knowing any real password. xkdc has a nice explanation. The simple cases base on wrong escaped strings and the like. But as this SQL [...]]]></description>
			<content:encoded><![CDATA[<p>What&#8217;s all the fuss about this <a href="http://en.wikipedia.org/wiki/SQL_injection">SQL Injection thing</a>?</p>
<p>It boils down getting some malicious crafted SQL code into the SQL code of an application, destroying data or authenticate yourself without knowing any real password. xkdc has a nice <a href="http://xkcd.com/327/">explanation</a>.</p>
<p>The simple cases base on wrong escaped strings and the like. But as this <a href="http://ferruh.mavituna.com/sql-injection-cheatsheet-oku/">SQL injection cheatsheet</a> shows there are an infinity number of possibilities. </p>
<p>At day most of the time my database connection is an Oracle connection and so i found this Oracle whitepaper titled <a href="http://www.oracle.com/technology/tech/pl_sql/pdf/how_to_write_injection_proof_plsql.pdf"><em>How to write injection-proof PL/SQL</em></a> very interesting (via <a href="http://www.schneier.com/blog/archives/2008/10/how_to_write_in.html">Bruce Schneier</a> found at the <a href="http://the-gay-bar.com/index.php?/archives/203-Dumb-security-tips-Think-before-you-follow-online-guides/">gay bar</a>).</p>
<p>I do not have a magic recipe for avoiding attack vectors all the time but as well as the whitepaper is written, it&#8217;s not a solution to expose all queries only via pl/sql to clients. In fact, it&#8217;s a nightmare to get this to work with JPA and other ORM mappers.</p>
<p>I try not to use dynamic sql in the sense of &#8220;concatenate some strings with one another and mysql_real_escape_string or DBMS_Assert. them&#8221; but use prepared statements with placeholders and explicit datatypes. Also if there&#8217;s a need for computing sql queries at runtime, do not ever let user supplied input come near them. I know that i&#8217;m relying to my api in this case but there is always a point on which i must rely on i guess. </p>
<p>As alway, the most important thing is: Be conscious about what you are doing and try to understand that, but at this point, i leave the discussion about software development and enter the depths of common sense…</p>
<p class="akst_link"><a href="http://info.michael-simons.eu/?p=221&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_221" class="akst_share_link " rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://info.michael-simons.eu/2008/10/27/fun-with-sql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Simple tokenizing with Oracle PL/SQL</title>
		<link>http://info.michael-simons.eu/2007/07/18/simple-tokenizing-with-oracle-plsql/</link>
		<comments>http://info.michael-simons.eu/2007/07/18/simple-tokenizing-with-oracle-plsql/#comments</comments>
		<pubDate>Wed, 18 Jul 2007 07:42:41 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[PL/SQL]]></category>
		<category><![CDATA[Tipps]]></category>

		<guid isPermaLink="false">http://info.michael-simons.eu/2007/07/18/simple-tokenizing-with-oracle-plsql/</guid>
		<description><![CDATA[I was in need of tokenizing some comma delimited data within an Oracle Database. A pity, there&#8217;s no split for a varchar2 like java.lang.String.split. I could have used Java in the database, but that would be lame, too.j I found this little function which uses pipelined results, that is, it returns his results while being [...]]]></description>
			<content:encoded><![CDATA[<p>I was in need of tokenizing some comma delimited data within an Oracle Database. A pity, there&#8217;s no split for a varchar2 like java.lang.String.split. I could have used Java in the database, but that would be lame, too.j</p>
<p>I found this little function which uses pipelined results, that is, it returns his results while being processed and furthermore, it can be used as a table in a from clause. Great as i need no extra code to check my values in my case.</p>
<p>So here it is:</p>

<div class="wp_syntax"><div class="code"><pre class="plsql" style="font-family:monospace;"><span style="color: #00F;">CREATE</span> <span style="color: #00F;">OR</span> <span style="color: #000;">REPLACE</span> <span style="color: #00F;">TYPE</span> split_tbl <span style="color: #00F;">AS</span> <span style="color: #00F;">TABLE</span> <span style="color: #00F;">OF</span> <span style="color: #00F;">VARCHAR2</span><span style="color: #00F;">&#40;</span><span style="color: #800;">32767</span><span style="color: #00F;">&#41;</span><span style="color: #00F;">;</span>
<span style="color: #00F;">/</span>
show errors<span style="color: #00F;">;</span>
&nbsp;
<span style="color: #00F;">CREATE</span> <span style="color: #00F;">OR</span> <span style="color: #000;">REPLACE</span> <span style="color: #00F;">FUNCTION</span> f_split <span style="color: #00F;">&#40;</span>
    p_list <span style="color: #00F;">VARCHAR2</span><span style="color: #00F;">,</span>
    p_del <span style="color: #00F;">VARCHAR2</span> <span style="color: #00F;">:=</span> <span style="color: #F00;">','</span>
<span style="color: #00F;">&#41;</span> <span style="color: #00F;">RETURN</span> split_tbl pipelined
<span style="color: #00F;">IS</span>
    l_idx    <span style="color: #00F;">PLS_INTEGER</span><span style="color: #00F;">;</span>
    l_list    <span style="color: #00F;">VARCHAR2</span><span style="color: #00F;">&#40;</span><span style="color: #800;">32767</span><span style="color: #00F;">&#41;</span> <span style="color: #00F;">:=</span> p_list<span style="color: #00F;">;</span>
    l_value <span style="color: #00F;">VARCHAR2</span><span style="color: #00F;">&#40;</span><span style="color: #800;">32767</span><span style="color: #00F;">&#41;</span><span style="color: #00F;">;</span>
<span style="color: #00F;">BEGIN</span>
    <span style="color: #00F;">LOOP</span>
        l_idx <span style="color: #00F;">:=</span> <span style="color: #000;">INSTR</span><span style="color: #00F;">&#40;</span>l_list<span style="color: #00F;">,</span>p_del<span style="color: #00F;">&#41;</span><span style="color: #00F;">;</span>
        <span style="color: #00F;">IF</span> l_idx <span style="color: #00F;">&gt;</span> <span style="color: #800;">0</span> <span style="color: #00F;">THEN</span>
            pipe <span style="color: #00F;">ROW</span><span style="color: #00F;">&#40;</span><span style="color: #000;">LTRIM</span><span style="color: #00F;">&#40;</span><span style="color: #000;">RTRIM</span><span style="color: #00F;">&#40;</span><span style="color: #000;">SUBSTR</span><span style="color: #00F;">&#40;</span>l_list<span style="color: #00F;">,</span><span style="color: #800;">1</span><span style="color: #00F;">,</span>l_idx<span style="color: #00F;">-</span><span style="color: #800;">1</span><span style="color: #00F;">&#41;</span><span style="color: #00F;">&#41;</span><span style="color: #00F;">&#41;</span><span style="color: #00F;">&#41;</span><span style="color: #00F;">;</span>
            l_list <span style="color: #00F;">:=</span> <span style="color: #000;">SUBSTR</span><span style="color: #00F;">&#40;</span>l_list<span style="color: #00F;">,</span>l_idx<span style="color: #00F;">+</span><span style="color: #000;">LENGTH</span><span style="color: #00F;">&#40;</span>p_del<span style="color: #00F;">&#41;</span><span style="color: #00F;">&#41;</span><span style="color: #00F;">;</span>
        <span style="color: #00F;">ELSE</span>
            pipe <span style="color: #00F;">ROW</span><span style="color: #00F;">&#40;</span><span style="color: #000;">LTRIM</span><span style="color: #00F;">&#40;</span><span style="color: #000;">RTRIM</span><span style="color: #00F;">&#40;</span>l_list<span style="color: #00F;">&#41;</span><span style="color: #00F;">&#41;</span><span style="color: #00F;">&#41;</span><span style="color: #00F;">;</span>
            <span style="color: #00F;">EXIT</span><span style="color: #00F;">;</span>
        <span style="color: #00F;">END</span> <span style="color: #00F;">IF</span><span style="color: #00F;">;</span>
    <span style="color: #00F;">END</span> <span style="color: #00F;">LOOP</span><span style="color: #00F;">;</span>
    <span style="color: #00F;">RETURN</span><span style="color: #00F;">;</span>
<span style="color: #00F;">END</span> f_split<span style="color: #00F;">;</span>
<span style="color: #00F;">/</span>
show errors<span style="color: #00F;">;</span></pre></div></div>

<p>This thing takes two parameters, the first one the string to be tokenized, the second an optional delimiter. It returns all tokens trimmed as a row for each token.</p>
<p>Kudos to <a href="http://articles.techrepublic.com.com/5100-9592-5259821.html">Scott Stephens</a>.</p>
<p class="akst_link"><a href="http://info.michael-simons.eu/?p=104&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_104" class="akst_share_link " rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://info.michael-simons.eu/2007/07/18/simple-tokenizing-with-oracle-plsql/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>On writing binary data from within Oracle Forms 6i</title>
		<link>http://info.michael-simons.eu/2007/01/29/on-writing-binary-data-from-within-oracle-forms-6i/</link>
		<comments>http://info.michael-simons.eu/2007/01/29/on-writing-binary-data-from-within-oracle-forms-6i/#comments</comments>
		<pubDate>Mon, 29 Jan 2007 08:45:08 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Oracle Forms]]></category>
		<category><![CDATA[PL/SQL]]></category>
		<category><![CDATA[Tipps]]></category>

		<guid isPermaLink="false">http://info.michael-simons.eu/2007/01/29/on-writing-binary-data-from-within-oracle-forms-6i/</guid>
		<description><![CDATA[There is this nice project of ours from 2002&#8230;. developed with Oracle Forms 6i and database PL/SQL Procedures. This project runs fine with an estimated 6gig database. Plain old client server model. We have some XML / XSLT based HTML reports that are processed &#8211; thanks to Oracle 9i &#8211; directly in the database with [...]]]></description>
			<content:encoded><![CDATA[<p>There is this nice project of ours from 2002&#8230;. developed with Oracle Forms 6i and database PL/SQL Procedures. This project runs fine with an estimated 6gig database. Plain old client server model.</p>
<p>We have some XML / XSLT based HTML reports that are processed &#8211; thanks to Oracle 9i &#8211; directly in the database with packages <em>dbms_xmlgen</em> and <em>xmlparser</em>. Data is collected in a mere handful of so called &#8220;object views&#8221;, that are denormalized, hierarchical views on data.</p>
<p>After receiving the assignment to generate pdf it was no big problem at all to write some java classes around <a href="http://www.lowagie.com/iText/">iText</a> and <a href="http://www.dom4j.org/">dom4j</a> to generate new reports.<br />
I decided agains xsl-fo as i found no inexpensive tools for easily designing adequate stylesheets. For the worse, xsl-fo lacks several important features, i.e. collapsing borders. My customers would have laughed at best if i had presented the prototype&#8230;</p>
<p>So i have this java classes &#8211; all in the database for sure, no need for java on the client side -, i have added code to my package and i thought it would be easy to write the resulting blob with Forms 6i to the client&#8230;</p>
<p>Bah! There is no such easy thing in Forms. I remembered havin&#8217; problems reading a clob, as the whole bunch of <em>dbms_lob</em> functionality doesn&#8217;t work in forms&#8230;  So my workaround for creating text files from clobs was on the database side:</p>

<div class="wp_syntax"><div class="code"><pre class="oracle8" style="font-family:monospace;"><span style="color: #993333; font-weight: bold; text-transform: uppercase;">PROCEDURE</span>  read_export<span style="color: #66cc66;">&#40;</span>
  p_export_id  <span style="color: #993333; font-weight: bold; text-transform: uppercase;">IN</span>     <span style="color: #993333; font-weight: bold; text-transform: uppercase;">NUMBER</span><span style="color: #66cc66;">,</span>
  p_menge      <span style="color: #993333; font-weight: bold; text-transform: uppercase;">IN</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">OUT</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">BINARY_INTEGER</span><span style="color: #66cc66;">,</span>
  p_offset     <span style="color: #993333; font-weight: bold; text-transform: uppercase;">IN</span>     <span style="color: #993333; font-weight: bold; text-transform: uppercase;">BINARY_INTEGER</span><span style="color: #66cc66;">,</span>
  p_buffer     <span style="color: #993333; font-weight: bold; text-transform: uppercase;">IN</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">OUT</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">VARCHAR2</span>
<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">IS</span>
 clInhalt  CLOB;
 <span style="color: #993333; font-weight: bold; text-transform: uppercase;">BEGIN</span>
  <span style="color: #993333; font-weight: bold; text-transform: uppercase;">BEGIN</span>
    <span style="color: #993333; font-weight: bold; text-transform: uppercase;">SELECT</span> processed_export
      <span style="color: #993333; font-weight: bold; text-transform: uppercase;">INTO</span> clInhalt
      <span style="color: #993333; font-weight: bold; text-transform: uppercase;">FROM</span> xmlt_exporte
     <span style="color: #993333; font-weight: bold; text-transform: uppercase;">WHERE</span> export_id <span style="color: #66cc66;">=</span> p_export_id;
    DBMS_LOB.READ<span style="color: #66cc66;">&#40;</span>clInhalt<span style="color: #66cc66;">,</span> p_menge<span style="color: #66cc66;">,</span> p_offset<span style="color: #66cc66;">,</span> p_buffer<span style="color: #66cc66;">&#41;</span>;
  <span style="color: #993333; font-weight: bold; text-transform: uppercase;">EXCEPTION</span>
    <span style="color: #993333; font-weight: bold; text-transform: uppercase;">WHEN</span> NO_DATA_FOUND <span style="color: #993333; font-weight: bold; text-transform: uppercase;">THEN</span>
      p_menge:<span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span>;
  <span style="color: #993333; font-weight: bold; text-transform: uppercase;">END</span>;
<span style="color: #993333; font-weight: bold; text-transform: uppercase;">EXCEPTION</span>
  <span style="color: #993333; font-weight: bold; text-transform: uppercase;">WHEN</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">OTHERS</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">THEN</span>
    p_menge :<span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span>;
<span style="color: #993333; font-weight: bold; text-transform: uppercase;">END</span>;</pre></div></div>

<p>and in a forms on client side:</p>

<div class="wp_syntax"><div class="code"><pre class="oracle8" style="font-family:monospace;">fhDateiOut :<span style="color: #66cc66;">=</span> text_io.fopen<span style="color: #66cc66;">&#40;</span>vcPath <span style="color: #66cc66;">||</span> vcFile<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'W'</span><span style="color: #66cc66;">&#41;</span>;   	  	   	
<span style="color: #993333; font-weight: bold; text-transform: uppercase;">LOOP</span>			
  pck_xml.read_export<span style="color: #66cc66;">&#40;</span>p_export_id<span style="color: #66cc66;">,</span> i<span style="color: #66cc66;">,</span> offset<span style="color: #66cc66;">,</span> vcBuffer<span style="color: #66cc66;">&#41;</span>;
  <span style="color: #993333; font-weight: bold; text-transform: uppercase;">EXIT</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">WHEN</span> i <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span>;
  offset :<span style="color: #66cc66;">=</span> offset <span style="color: #66cc66;">+</span> i;
  text_io.put<span style="color: #66cc66;">&#40;</span>fhDateiOut<span style="color: #66cc66;">,</span> vcBuffer<span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold; text-transform: uppercase;">END</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">LOOP</span>;					   
text_io.fclose<span style="color: #66cc66;">&#40;</span>fhDateiOut<span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>(text_io is a forms standard package).</p>
<p>This works quite well.. So i thought, well, d2kwutil has some functions to write binary files, so i copy the database procedure, use dbms_lob.read with blob and raw and i&#8217;m done&#8230;<br />
Yeah, i was done. Well fucked off.</p>
<p>I have no idea in which way dbms_lob.read converts blob data to raw, but it&#8217;s everything but the original. So after banging my head against the wall, finding things like &#8220;use software developed in this century&#8221; in forums, i wrote the following java code:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">final</span> BASE64Encoder enc <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> BASE64Encoder<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">final</span> CLOB rv <span style="color: #339933;">=</span> CLOB.<span style="color: #006633;">createTemporary</span><span style="color: #009900;">&#40;</span>tmp.<span style="color: #006633;">getJavaSqlConnection</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, <span style="color: #000066; font-weight: bold;">true</span>, CLOB.<span style="color: #006633;">DURATION_SESSION</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">int</span> bufSize <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1024</span><span style="color: #339933;">*</span><span style="color: #cc66cc;">1024</span><span style="color: #339933;">*</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">BufferedInputStream</span> in <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BufferedInputStream</span><span style="color: #009900;">&#40;</span>tmp.<span style="color: #006633;">getBinaryStream</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, bufSize <span style="color: #339933;">*</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>        
<span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">BufferedOutputStream</span> out <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BufferedOutputStream</span><span style="color: #009900;">&#40;</span>rv.<span style="color: #006633;">setAsciiStream</span><span style="color: #009900;">&#40;</span>0L<span style="color: #009900;">&#41;</span>, bufSize<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
enc.<span style="color: #006633;">encode</span><span style="color: #009900;">&#40;</span>in, out<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
out.<span style="color: #006633;">flush</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
out.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>which runs in the database, takes a blob as parameter and base64 encodes it to a clob. This clob is written to my export table and read by forms in the above way. Then i have a little base64.exe along with my forms that is called from within forms that decodes the file&#8230;.</p>
<p>So much trouble just for writing binary data from server to client&#8230; it&#8217;s a twoliner with c or java. </p>
<p class="akst_link"><a href="http://info.michael-simons.eu/?p=56&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_56" class="akst_share_link " rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://info.michael-simons.eu/2007/01/29/on-writing-binary-data-from-within-oracle-forms-6i/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>IS_NUMERIC, IS_NUMBER oder ähnliches&#8230;</title>
		<link>http://info.michael-simons.eu/2006/10/18/is_numeric-is_number-oder-ahnliches/</link>
		<comments>http://info.michael-simons.eu/2006/10/18/is_numeric-is_number-oder-ahnliches/#comments</comments>
		<pubDate>Wed, 18 Oct 2006 12:18:38 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[PL/SQL]]></category>

		<guid isPermaLink="false">http://info.michael-simons.eu/2006/10/18/is_numeric-is_number-oder-ahnliches/</guid>
		<description><![CDATA[Kann sein, dass es in einem großen Datenbankprodukt namens Oracle keine Methode isNumeric oder ähnliches gibt, die mir sagt, ob ein String eine Zahl repräsentiert? Es kann&#8230; Deswegen hier eine kleine Methode: CREATE OR REPLACE FUNCTION f_makeNumber&#40;inval IN VARCHAR2&#41; RETURN NUMBER IS rv NUMBER; numCharSet VARCHAR2&#40;32&#41;; BEGIN SELECT VALUE INTO numCharSet FROM nls_session_parameters WHERE parameter [...]]]></description>
			<content:encoded><![CDATA[<p>Kann sein, dass es in einem großen Datenbankprodukt namens Oracle keine Methode isNumeric oder ähnliches gibt, die mir sagt, ob ein String eine Zahl repräsentiert? Es kann&#8230;</p>
<p>Deswegen hier eine kleine Methode:</p>

<div class="wp_syntax"><div class="code"><pre class="oracle8" style="font-family:monospace;"><span style="color: #993333; font-weight: bold; text-transform: uppercase;">CREATE</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">OR</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">REPLACE</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">FUNCTION</span> f_makeNumber<span style="color: #66cc66;">&#40;</span>inval <span style="color: #993333; font-weight: bold; text-transform: uppercase;">IN</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">VARCHAR2</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">RETURN</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">NUMBER</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">IS</span>
  rv <span style="color: #993333; font-weight: bold; text-transform: uppercase;">NUMBER</span>;
  numCharSet <span style="color: #993333; font-weight: bold; text-transform: uppercase;">VARCHAR2</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">32</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold; text-transform: uppercase;">BEGIN</span>
  <span style="color: #993333; font-weight: bold; text-transform: uppercase;">SELECT</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">VALUE</span>
  <span style="color: #993333; font-weight: bold; text-transform: uppercase;">INTO</span>   numCharSet
  <span style="color: #993333; font-weight: bold; text-transform: uppercase;">FROM</span>   nls_session_parameters
  <span style="color: #993333; font-weight: bold; text-transform: uppercase;">WHERE</span>  parameter <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'NLS_NUMERIC_CHARACTERS'</span>;
&nbsp;
  <span style="color: #993333; font-weight: bold; text-transform: uppercase;">BEGIN</span>
    <span style="color: #993333; font-weight: bold; text-transform: uppercase;">SELECT</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">DECODE</span><span style="color: #66cc66;">&#40;</span>
             <span style="color: #993333; font-weight: bold; text-transform: uppercase;">NVL</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold; text-transform: uppercase;">LENGTH</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold; text-transform: uppercase;">TRANSLATE</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold; text-transform: uppercase;">TRIM</span><span style="color: #66cc66;">&#40;</span>inval<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">' +-.,0123456789'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">' '</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
              <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span><span style="color: #993333; font-weight: bold; text-transform: uppercase;">TO_NUMBER</span><span style="color: #66cc66;">&#40;</span>
                <span style="color: #993333; font-weight: bold; text-transform: uppercase;">CASE</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">WHEN</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">VALUE</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'.,'</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">THEN</span>
                  <span style="color: #993333; font-weight: bold; text-transform: uppercase;">REPLACE</span><span style="color: #66cc66;">&#40;</span>inval<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">','</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'.'</span><span style="color: #66cc66;">&#41;</span>
                     <span style="color: #993333; font-weight: bold; text-transform: uppercase;">WHEN</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">VALUE</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">',.'</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">THEN</span>
                  <span style="color: #993333; font-weight: bold; text-transform: uppercase;">REPLACE</span><span style="color: #66cc66;">&#40;</span>inval<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'.'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">','</span><span style="color: #66cc66;">&#41;</span>
                <span style="color: #993333; font-weight: bold; text-transform: uppercase;">END</span>              
              <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
              <span style="color: #993333; font-weight: bold; text-transform: uppercase;">NULL</span>
           <span style="color: #66cc66;">&#41;</span>
    <span style="color: #993333; font-weight: bold; text-transform: uppercase;">INTO</span>   rv
    <span style="color: #993333; font-weight: bold; text-transform: uppercase;">FROM</span>   nls_session_parameters
    <span style="color: #993333; font-weight: bold; text-transform: uppercase;">WHERE</span>  parameter <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'NLS_NUMERIC_CHARACTERS'</span>;
  <span style="color: #993333; font-weight: bold; text-transform: uppercase;">EXCEPTION</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">WHEN</span> invalid_number <span style="color: #993333; font-weight: bold; text-transform: uppercase;">THEN</span>
    rv :<span style="color: #66cc66;">=</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">NULL</span>;
  <span style="color: #993333; font-weight: bold; text-transform: uppercase;">END</span>;
&nbsp;
  <span style="color: #993333; font-weight: bold; text-transform: uppercase;">RETURN</span> rv;
&nbsp;
<span style="color: #993333; font-weight: bold; text-transform: uppercase;">END</span> f_makeNumber;
<span style="color: #66cc66;">/</span></pre></div></div>

<p>Diese Methode gibt den Zahlenwert des Strings &#8216;inval&#8217; zurück, falls es sich um eine Zahl handelt, ansonsten null. NLS_NUMERIC Characters werden berücksichtigt (2.0 und 2,0 werden beides zu Zahlen), Strings wie 2.000,0 lassen sich damit allerdings nicht verarbeiten.</p>
<p class="akst_link"><a href="http://info.michael-simons.eu/?p=42&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_42" class="akst_share_link " rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://info.michael-simons.eu/2006/10/18/is_numeric-is_number-oder-ahnliches/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Haufenweise: Bulk Insert, Update, Delete</title>
		<link>http://info.michael-simons.eu/2006/04/24/haufenweise-bulk-insert-update-delete/</link>
		<comments>http://info.michael-simons.eu/2006/04/24/haufenweise-bulk-insert-update-delete/#comments</comments>
		<pubDate>Mon, 24 Apr 2006 07:01:52 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[German posts]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[PL/SQL]]></category>
		<category><![CDATA[Tipps]]></category>

		<guid isPermaLink="false">http://www.msimons.info/?p=8</guid>
		<description><![CDATA[Bulk Methoden in PL/SQL sind praktisch und schnell. Auch recht einfach anzuwenden. Allerdings ist mir in Oracle 9.2.0.6 ein sehr komisches Verhalten aufgefallen: DECLARE TYPE id_table IS TABLE OF NUMBER; objekt_ids id_table; BEGIN SELECT id BULK COLLECT INTO objekt_ids FROM irgendwas WHERE irgendwasanderes = 'wasweißich'; &#160; FORALL idx IN objekt_ids.first .. objekt_ids.last DELETE FROM table1 [...]]]></description>
			<content:encoded><![CDATA[<p>Bulk Methoden in PL/SQL sind praktisch und schnell. Auch recht einfach anzuwenden. Allerdings ist mir in Oracle 9.2.0.6 ein sehr komisches Verhalten aufgefallen:</p>

<div class="wp_syntax"><div class="code"><pre class="oracle8" style="font-family:monospace;"><span style="color: #993333; font-weight: bold; text-transform: uppercase;">DECLARE</span>
  <span style="color: #993333; font-weight: bold; text-transform: uppercase;">TYPE</span> id_table <span style="color: #993333; font-weight: bold; text-transform: uppercase;">IS</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">TABLE</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">OF</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">NUMBER</span>;
  objekt_ids id_table;
<span style="color: #993333; font-weight: bold; text-transform: uppercase;">BEGIN</span>
    <span style="color: #993333; font-weight: bold; text-transform: uppercase;">SELECT</span> id
    <span style="color: #993333; font-weight: bold; text-transform: uppercase;">BULK</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">COLLECT</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">INTO</span> objekt_ids
    <span style="color: #993333; font-weight: bold; text-transform: uppercase;">FROM</span>   irgendwas
    <span style="color: #993333; font-weight: bold; text-transform: uppercase;">WHERE</span>  irgendwasanderes <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'wasweißich'</span>;
&nbsp;
    <span style="color: #993333; font-weight: bold; text-transform: uppercase;">FORALL</span> idx <span style="color: #993333; font-weight: bold; text-transform: uppercase;">IN</span> objekt_ids.first .. objekt_ids.last
      <span style="color: #993333; font-weight: bold; text-transform: uppercase;">DELETE</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">FROM</span> table1 <span style="color: #993333; font-weight: bold; text-transform: uppercase;">WHERE</span> objekt_id <span style="color: #66cc66;">=</span> objekt_ids<span style="color: #66cc66;">&#40;</span>idx<span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #993333; font-weight: bold; text-transform: uppercase;">FORALL</span> idx <span style="color: #993333; font-weight: bold; text-transform: uppercase;">IN</span> objekt_ids.first .. objekt_ids.last
      <span style="color: #993333; font-weight: bold; text-transform: uppercase;">DELETE</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">FROM</span> table2 <span style="color: #993333; font-weight: bold; text-transform: uppercase;">WHERE</span> objekt_id <span style="color: #66cc66;">=</span> objekt_ids<span style="color: #66cc66;">&#40;</span>idx<span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #808080; font-style: italic;">-- ...</span>
<span style="color: #993333; font-weight: bold; text-transform: uppercase;">END</span>;</pre></div></div>

<p>Das Beispiel ist jetzt natürlich erstmal sinnlos, ist aber auch egal. Der Haken an der Sache: Das <em>BULK COLLECT INTO</em> Statement wirft keine <em>NO_DATA_FOUND</em> Exception, wenn die Ergebnismenge leer ist (im Gegensatz zu einem normalen SELECT INTO). Nichts desto trotz ist <em>object_ids</em> danach eine korrekt initialisierte Zusammenstellung.</p>
<p>War die Ergebnismenge leer, gibt es trotzdem eine Exception. Und zwar eine <em>INVALID_NUMBER</em>. Aus irgendeinem Grund laufen die forall Schleifen, auch wenn die virtuelle Tabelle leer ist.</p>
<p>Deshalb gilt für BULK Methoden: Abfragen, ob die Indextabellen leer sind!</p>

<div class="wp_syntax"><div class="code"><pre class="oracle8" style="font-family:monospace;"><span style="color: #993333; font-weight: bold; text-transform: uppercase;">DECLARE</span>
  <span style="color: #993333; font-weight: bold; text-transform: uppercase;">TYPE</span> id_table <span style="color: #993333; font-weight: bold; text-transform: uppercase;">IS</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">TABLE</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">OF</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">NUMBER</span>;
  objekt_ids id_table;
<span style="color: #993333; font-weight: bold; text-transform: uppercase;">BEGIN</span>
  <span style="color: #993333; font-weight: bold; text-transform: uppercase;">IF</span><span style="color: #66cc66;">&#40;</span>objekt_ids.<span style="color: #993333; font-weight: bold; text-transform: uppercase;">COUNT</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #993333; font-weight: bold; text-transform: uppercase;">THEN</span>
    <span style="color: #993333; font-weight: bold; text-transform: uppercase;">SELECT</span> id
    <span style="color: #993333; font-weight: bold; text-transform: uppercase;">BULK</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">COLLECT</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">INTO</span> objekt_ids
    <span style="color: #993333; font-weight: bold; text-transform: uppercase;">FROM</span>   irgendwas
    <span style="color: #993333; font-weight: bold; text-transform: uppercase;">WHERE</span>  irgendwasanderes <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'wasweißich'</span>;
&nbsp;
    <span style="color: #993333; font-weight: bold; text-transform: uppercase;">FORALL</span> idx <span style="color: #993333; font-weight: bold; text-transform: uppercase;">IN</span> objekt_ids.first .. objekt_ids.last
      <span style="color: #993333; font-weight: bold; text-transform: uppercase;">DELETE</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">FROM</span> table1 <span style="color: #993333; font-weight: bold; text-transform: uppercase;">WHERE</span> objekt_id <span style="color: #66cc66;">=</span> objekt_ids<span style="color: #66cc66;">&#40;</span>idx<span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #993333; font-weight: bold; text-transform: uppercase;">FORALL</span> idx <span style="color: #993333; font-weight: bold; text-transform: uppercase;">IN</span> objekt_ids.first .. objekt_ids.last
      <span style="color: #993333; font-weight: bold; text-transform: uppercase;">DELETE</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">FROM</span> table2 <span style="color: #993333; font-weight: bold; text-transform: uppercase;">WHERE</span> objekt_id <span style="color: #66cc66;">=</span> objekt_ids<span style="color: #66cc66;">&#40;</span>idx<span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #808080; font-style: italic;">-- ...</span>
  <span style="color: #993333; font-weight: bold; text-transform: uppercase;">END</span> <span style="color: #993333; font-weight: bold; text-transform: uppercase;">IF</span>;
<span style="color: #993333; font-weight: bold; text-transform: uppercase;">END</span>;</pre></div></div>

<p class="akst_link"><a href="http://info.michael-simons.eu/?p=8&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_8" class="akst_share_link " rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://info.michael-simons.eu/2006/04/24/haufenweise-bulk-insert-update-delete/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
