<?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>Oracle - Concepts et Exemples &#187; udf</title>
	<atom:link href="https://blog.developpez.com/pachot/tag/udf/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/pachot</link>
	<description>Les fonctionalités et concepts d&#039;Oracle à partir de traductions et de démos</description>
	<lastBuildDate>Sun, 03 Apr 2016 20:36:21 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>12c: optimisation des appels de fonctions PL/SQL à partir de SQL</title>
		<link>https://blog.developpez.com/pachot/12c_udf_pragma/</link>
		<comments>https://blog.developpez.com/pachot/12c_udf_pragma/#comments</comments>
		<pubDate>Mon, 16 Sep 2013 19:16:11 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[12c]]></category>
		<category><![CDATA[pragma]]></category>
		<category><![CDATA[udf]]></category>
		<category><![CDATA[with_plqsl]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/pachot/?p=703</guid>
		<description><![CDATA[Dans les requêtes SQL, on peut utiliser des fonctions standard (substr, to_date,&#8230; ) et lorsqu&#8217;on a un besoin un peu plus spécifique, on peut créer des des UDF (User Defined Function). Avec Oracle, les fonctions standard sont codées en C, &#8230; <a href="https://blog.developpez.com/pachot/12c_udf_pragma/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Dans les requêtes SQL, on peut utiliser des fonctions standard (substr, to_date,&#8230; ) et lorsqu&rsquo;on a un besoin un peu plus spécifique, on peut créer des des UDF (User Defined Function).<br />
Avec Oracle, les fonctions standard sont codées en C, directement exécutable lors de l&rsquo;exécution SQL. Mais les UDF sont simplement des appels à des fonctions PL/SQL stockées. Le problème lorsqu&rsquo;on passe d&rsquo;un language (SQL) à un autre (PL/SQL) en cours d&rsquo;exécution: il y a un switch de contexte à chaque fois. C&rsquo;est très consommateur de CPU. Surtout lorsqu&rsquo;on appelle la fonction pour chaque ligne.</p>
<p>Jusqu&rsquo;en 11g, les solutions sont:</p>
<ul>
<li>Utiliser seulement des fonctions standard</li>
<li>Eviter l&rsquo;appel ligne à ligne avec les pipelined functions</li>
<li>Lorsque le résultat de la fonction est déterministe et qu&rsquo;il est applelé plusieurs fois pour les même valeurs, déclarer la fonction en deterministic</li>
</ul>
<p>En 12c on a des vrais UDF optimisées pour les appels à partir de SQL.</p>
<p>On peut utiliser le pragma UDF pour une fonction stockée, par exemple:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">create or replace function TEST_SPELL(n number) return varchar2 as pragma UDF; begin return to_char( date'-4712-01-01'+n-1,'Jsp'); end;<br />
/<br />
select max(spelled) from ( select TEST_SPELL(num) spelled from TEST);</div></div>
<p>Et on peut aussi déclarer la fonction comme un bloc PL/SQL anonyme dans la requête SQL:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">with function TEST_SPELL(n number) return varchar2 as begin return to_char( date'-4712-01-01'+n-1,'Jsp'); end; <br />
select /*+ TEST1 */ max(spelled) from ( select TEST_SPELL(num) spelled from TEST)<br />
&nbsp;/</div></div>
<p><ins datetime="2013-09-16T18:42:15+00:00">Dans la <a href="http://ora-demo.pachot.net/12c_udf_pragma.html" title="demo" target="_blank">demo</a> j&rsquo;appelle une fonction simple pour 1 million de lignes</ins><br />
Dans la version 11g, les temps &lsquo;sql execute elapsed time&rsquo; et &lsquo;PL/SQL execution elapsed time&rsquo; sont considérables, alors que ni la requête ni la fonction ne sont très complexes.<br />
C&rsquo;est parce chacun inclut le switch de contexte vers l&rsquo;autre language.<br />
En utilisant pragma udf ou le with plsql (déjà exposé <a href="http://blog.developpez.com/pachot/12c_with_plsql/">ici</a>) c&rsquo;est une centaine de secondes que l&rsquo;on gagne pour les 1 million d&rsquo;appels.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
