{"id":544,"date":"2011-10-14T12:17:56","date_gmt":"2011-10-14T12:17:56","guid":{"rendered":"http:\/\/bar-solutions.com\/weblog\/?p=544"},"modified":"2011-10-14T12:17:56","modified_gmt":"2011-10-14T12:17:56","slug":"","status":"publish","type":"post","link":"https:\/\/blog.bar-solutions.com\/?p=544","title":{"rendered":"Make use of exceptions"},"content":{"rendered":"<p align=\"left\">While I was browsing the <a title=\"PL\/SQL Developer - Allround Automations forums\" href=\"http:\/\/forums.allroundautomations.com\/ubb\/ubbthreads.php?ubb=postlist&amp;Board=3&amp;page=1\" rel=\"nofollow\" target=\"_blank\">supportforum<\/a> of <a title=\"Allround Automations PL\/SQL Developer\" href=\"http:\/\/www.allroundautomations.com\/plsqldev.html\" rel=\"nofollow\" target=\"_blank\">PL\/SQL Developer<\/a> by <a title=\"Allround Automations\" href=\"http:\/\/www.allroundautomations.com\/\" rel=\"nofollow\" target=\"_blank\">Allround Automations<\/a> I came across a <a title=\"Spesial Copy of Procedures and functions. - Allround Automations forums\" href=\"http:\/\/forums.allroundautomations.com\/ubb\/ubbthreads.php?ubb=showflat&amp;Number=42365#Post42365\" rel=\"nofollow\" target=\"_blank\">thread<\/a> about the special copy function of PL\/SQL Developer. In this thread a function was written to determine if a sent in parameter (VARCHAR2) was numeric or not. I took this implementation and created my own depending on the exceptions thrown by <a title=\"Oracle\" href=\"http:\/\/www.oracle.com\/\" rel=\"nofollow\" target=\"_blank\">Oracle<\/a>.<\/p>\n<div align=\"left\">\n<p><!--more--><\/p>\n<\/div>\n<p align=\"left\">The original code is as follows:<\/p>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">   1:  <\/span><span class=\"kwrd\">CREATE<\/span> <span class=\"kwrd\">OR<\/span> REPLACE <span class=\"kwrd\">FUNCTION<\/span> is_numeric(parameter_ <span class=\"kwrd\">IN<\/span> VARCHAR2) <span class=\"kwrd\">RETURN<\/span> NUMBER <span class=\"kwrd\">IS<\/span><\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">   2:  <\/span>&#160;<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">   3:  <\/span>  char_         VARCHAR2(1);<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">   4:  <\/span>  char_counter_ <span class=\"kwrd\">INTEGER<\/span>;<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">   5:  <\/span>  is_numeric_   NUMBER;<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">   6:  <\/span>&#160;<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">   7:  <\/span><span class=\"kwrd\">BEGIN<\/span><\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">   8:  <\/span> <\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">   9:  <\/span>  is_numeric_   := 1;<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">  10:  <\/span>  char_counter_ := 0;<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">  11:  <\/span>  <span class=\"kwrd\">WHILE<\/span> (char_counter_ &lt;= length(parameter_)) LOOP<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">  12:  <\/span>    char_counter_ := char_counter_ + 1;<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">  13:  <\/span>    char_         := substr(parameter_, char_counter_, 1);<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">  14:  <\/span>    <span class=\"kwrd\">IF<\/span> (instr(<span class=\"str\">'0123456789'<\/span>, char_, 1) = 0) <span class=\"kwrd\">THEN<\/span><\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">  15:  <\/span>      is_numeric_ := 0;<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">  16:  <\/span>      <span class=\"kwrd\">EXIT<\/span>;<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">  17:  <\/span>    <span class=\"kwrd\">END<\/span> <span class=\"kwrd\">IF<\/span>;<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">  18:  <\/span>  <span class=\"kwrd\">END<\/span> LOOP;<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">  19:  <\/span> <\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">  20:  <\/span>  <span class=\"kwrd\">RETURN<\/span>(is_numeric_);<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">  21:  <\/span><span class=\"kwrd\">END<\/span> is_numeric;<\/pre>\n<\/div>\n<style type=\"text\/css\">\n<p>.csharpcode, .csharpcode pre\n{\n\tfont-size: small;\n\tcolor: black;\n\tfont-family: consolas, \"Courier New\", courier, monospace;\n\tbackground-color: #ffffff;\n\t\/*white-space: pre;*\/\n}\n.csharpcode pre { margin: 0em; }\n.csharpcode .rem { color: #008000; }\n.csharpcode .kwrd { color: #0000ff; }\n.csharpcode .str { color: #006080; }\n.csharpcode .op { color: #0000c0; }\n.csharpcode .preproc { color: #cc6633; }\n.csharpcode .asp { background-color: #ffff00; }\n.csharpcode .html { color: #800000; }\n.csharpcode .attr { color: #ff0000; }\n.csharpcode .alt \n{\n\tbackground-color: #f4f4f4;\n\twidth: 100%;\n\tmargin: 0em;\n}\n.csharpcode .lnum { color: #606060; }<\/style>\n<p align=\"left\">What this code does is check every character to see if it&#8217;s a numeric character. What happens if you send in a negative number? Or if you prefix a positive number with a plus sign (+)? The current code will flag this as NOT numeric while it actually is.<\/p>\n<p align=\"left\">I figured I should use what is there and let Oracle do the heavy lifting. Rely on what the guys in the PL\/SQL team have come up with.<\/p>\n<p align=\"left\">My code looks like this:<\/p>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">   1:  <\/span><span class=\"kwrd\">CREATE<\/span> <span class=\"kwrd\">OR<\/span> REPLACE <span class=\"kwrd\">FUNCTION<\/span> is_numeric_pba(parameter_in <span class=\"kwrd\">IN<\/span> VARCHAR2) <span class=\"kwrd\">RETURN<\/span> NUMBER <span class=\"kwrd\">IS<\/span><\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">   2:  <\/span>  l_is_numeric NUMBER;<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">   3:  <\/span>  l_number     NUMBER;<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">   4:  <\/span><span class=\"kwrd\">BEGIN<\/span><\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">   5:  <\/span>  <span class=\"kwrd\">BEGIN<\/span><\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">   6:  <\/span>    <span class=\"rem\">-- try to convert the parameter to a number<\/span><\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">   7:  <\/span>    l_number := to_number(parameter_in);<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">   8:  <\/span>    <span class=\"rem\">-- if it works then it's a number<\/span><\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">   9:  <\/span>    l_is_numeric := 1;<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">  10:  <\/span>  <span class=\"kwrd\">EXCEPTION<\/span><\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">  11:  <\/span>    <span class=\"kwrd\">WHEN<\/span> OTHERS <span class=\"kwrd\">THEN<\/span><\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">  12:  <\/span>      <span class=\"rem\">-- if it fails then it's not a number<\/span><\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">  13:  <\/span>      l_is_numeric := 0;<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">  14:  <\/span>  <span class=\"kwrd\">END<\/span>;<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">  15:  <\/span>  <span class=\"kwrd\">RETURN<\/span>(l_is_numeric);<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">  16:  <\/span><span class=\"kwrd\">END<\/span> is_numeric_pba;<\/pre>\n<\/div>\n<style type=\"text\/css\">\n<p>.csharpcode, .csharpcode pre\n{\n\tfont-size: small;\n\tcolor: black;\n\tfont-family: consolas, \"Courier New\", courier, monospace;\n\tbackground-color: #ffffff;\n\t\/*white-space: pre;*\/\n}\n.csharpcode pre { margin: 0em; }\n.csharpcode .rem { color: #008000; }\n.csharpcode .kwrd { color: #0000ff; }\n.csharpcode .str { color: #006080; }\n.csharpcode .op { color: #0000c0; }\n.csharpcode .preproc { color: #cc6633; }\n.csharpcode .asp { background-color: #ffff00; }\n.csharpcode .html { color: #800000; }\n.csharpcode .attr { color: #ff0000; }\n.csharpcode .alt \n{\n\tbackground-color: #f4f4f4;\n\twidth: 100%;\n\tmargin: 0em;\n}\n.csharpcode .lnum { color: #606060; }<\/style>\n<p align=\"left\">This code lets Oracle try to convert the characters into a number. If it succeeds in doing so, it&#8217;s a number. If it fails, then an exception will be thrown so it is not a number. This code also works for negative numbers and signed numbers. Heck, it even works for calculations.<br \/>\n  <br \/>It is even faster than the original. <\/p>\n<p>The test code:<\/p>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">   1:  <\/span>clear screen<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">   2:  <\/span><span class=\"kwrd\">set<\/span> serveroutput <span class=\"kwrd\">on<\/span> <span class=\"kwrd\">size<\/span> 9000000<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">   3:  <\/span><span class=\"kwrd\">set<\/span> timing <span class=\"kwrd\">on<\/span><\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">   4:  <\/span><span class=\"kwrd\">declare<\/span><\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">   5:  <\/span>  l number;<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">   6:  <\/span><span class=\"kwrd\">begin<\/span><\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">   7:  <\/span>  <span class=\"kwrd\">for<\/span> i <span class=\"kwrd\">in<\/span> 1 .. 100000 loop<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">   8:  <\/span>    l := (is_numeric(i));<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">   9:  <\/span>  <span class=\"kwrd\">end<\/span> loop;<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">  10:  <\/span><span class=\"kwrd\">end<\/span>;<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">  11:  <\/span>\/<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">  12:  <\/span><span class=\"kwrd\">declare<\/span><\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">  13:  <\/span>  l number;<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">  14:  <\/span><span class=\"kwrd\">begin<\/span><\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">  15:  <\/span>  <span class=\"kwrd\">for<\/span> i <span class=\"kwrd\">in<\/span> 1 .. 100000 loop<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">  16:  <\/span>    l := (is_numeric_pba(i));<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">  17:  <\/span>  <span class=\"kwrd\">end<\/span> loop;<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">  18:  <\/span><span class=\"kwrd\">end<\/span>;<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">  19:  <\/span>\/<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">  20:  <\/span>&#160;<\/pre>\n<\/div>\n<p align=\"left\">\n<style type=\"text\/css\">\n<p>.csharpcode, .csharpcode pre\n{\n\tfont-size: small;\n\tcolor: black;\n\tfont-family: consolas, \"Courier New\", courier, monospace;\n\tbackground-color: #ffffff;\n\t\/*white-space: pre;*\/\n}\n.csharpcode pre { margin: 0em; }\n.csharpcode .rem { color: #008000; }\n.csharpcode .kwrd { color: #0000ff; }\n.csharpcode .str { color: #006080; }\n.csharpcode .op { color: #0000c0; }\n.csharpcode .preproc { color: #cc6633; }\n.csharpcode .asp { background-color: #ffff00; }\n.csharpcode .html { color: #800000; }\n.csharpcode .attr { color: #ff0000; }\n.csharpcode .alt \n{\n\tbackground-color: #f4f4f4;\n\twidth: 100%;\n\tmargin: 0em;\n}\n.csharpcode .lnum { color: #606060; }<\/style>\n<p>Some results: <\/p>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">   1:  <\/span>Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">   2:  <\/span>Connected<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">   3:  <\/span> <\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">   4:  <\/span>PL\/SQL procedure successfully completed<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">   5:  <\/span> <\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">   6:  <\/span>Executed in 0.375 seconds<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">   7:  <\/span> <\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">   8:  <\/span>PL\/SQL procedure successfully completed<\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre class=\"alt\"><span class=\"lnum\">   9:  <\/span> <\/pre>\n<\/div>\n<div class=\"csharpcode\" align=\"left\">\n<pre><span class=\"lnum\">  10:  <\/span>Executed in 0.094 seconds<\/pre>\n<\/div>\n<p align=\"left\">\n<style type=\"text\/css\">\n<p>.csharpcode, .csharpcode pre\n{\n\tfont-size: small;\n\tcolor: black;\n\tfont-family: consolas, \"Courier New\", courier, monospace;\n\tbackground-color: #ffffff;\n\t\/*white-space: pre;*\/\n}\n.csharpcode pre { margin: 0em; }\n.csharpcode .rem { color: #008000; }\n.csharpcode .kwrd { color: #0000ff; }\n.csharpcode .str { color: #006080; }\n.csharpcode .op { color: #0000c0; }\n.csharpcode .preproc { color: #cc6633; }\n.csharpcode .asp { background-color: #ffff00; }\n.csharpcode .html { color: #800000; }\n.csharpcode .attr { color: #ff0000; }\n.csharpcode .alt \n{\n\tbackground-color: #f4f4f4;\n\twidth: 100%;\n\tmargin: 0em;\n}\n.csharpcode .lnum { color: #606060; }<\/style>\n<p>(I had to run it a lot of times to see any difference ;-)) <\/p>\n<p>Seems that Oracle internally does a better and faster job than you can with your own code :-).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>While I was browsing the supportforum of PL\/SQL Developer by Allround Automations I came across a thread about the special copy function of PL\/SQL Developer. In this thread a function was written to determine if a sent in parameter (VARCHAR2) was numeric or not. I took this implementation and created my own depending on the [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,5],"tags":[],"class_list":["post-544","post","type-post","status-publish","format-standard","hentry","category-oracle","category-plsql"],"_links":{"self":[{"href":"https:\/\/blog.bar-solutions.com\/index.php?rest_route=\/wp\/v2\/posts\/544","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.bar-solutions.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.bar-solutions.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.bar-solutions.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.bar-solutions.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=544"}],"version-history":[{"count":0,"href":"https:\/\/blog.bar-solutions.com\/index.php?rest_route=\/wp\/v2\/posts\/544\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.bar-solutions.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=544"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.bar-solutions.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=544"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.bar-solutions.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=544"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}