<?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>entwicklungsgedanken &#187; PL/SQL</title>
	<atom:link href="http://www.entwicklungsgedanken.de/category/plsql/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.entwicklungsgedanken.de</link>
	<description>Verschiedene Gedanken rund um die Softwareentwicklung</description>
	<lastBuildDate>Thu, 29 Jul 2010 11:09:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>WITH-Klausel</title>
		<link>http://www.entwicklungsgedanken.de/2010/04/15/with-klausel/</link>
		<comments>http://www.entwicklungsgedanken.de/2010/04/15/with-klausel/#comments</comments>
		<pubDate>Thu, 15 Apr 2010 09:52:00 +0000</pubDate>
		<dc:creator>clausbajor</dc:creator>
				<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[PL/SQL]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Verschiedenes]]></category>

		<guid isPermaLink="false">http://www.entwicklungsgedanken.de/2010/04/15/with-klausel/</guid>
		<description><![CDATA[In der Praxis trifft man von Zeit zu Zeit auf aufgeblaehte SQL-Queries, die ausserordentlich kostenintensiven und langwierigen Ausfuehrungsplaenen folgen. Zeigt eine weitergehende Analyse, dass die komplexe Abfrage eine oder mehrere Subqueries enthaelt, die mehrfach ausgefuehrt werden, dann besteht eine sehr gute Chance durch Verwendung der sogenannten WITH-Klausel, die Performance der Abfrageausfuehrung erheblich zu steigern. Im [...]]]></description>
			<content:encoded><![CDATA[<p>In der Praxis trifft man von Zeit zu Zeit auf aufgeblaehte SQL-Queries, die ausserordentlich kostenintensiven und langwierigen Ausfuehrungsplaenen folgen.    <br />Zeigt eine weitergehende Analyse, dass die komplexe Abfrage eine oder mehrere Subqueries enthaelt, die mehrfach ausgefuehrt werden, dann besteht eine sehr     <br />gute Chance durch Verwendung der sogenannten WITH-Klausel, die Performance der Abfrageausfuehrung erheblich zu steigern. </p>
<p>Im Kern wird die schnellere Ausfuehrung der Query dadurch realisiert, dass mittels der WITH-Klausel die Ergebnismenge der Subquery vorab materialisiert, mit einem Namen versehen und schliesslich in der Hauptquery abgegriffen wird.    <br />Hier lohnt sich auch ein Vergleich und Gebrauch von &quot;global temporary tables&quot;, die in Ihrer Funktions- und Wirkungsweise durchaus ähnlich sind:     <br />Durch Entkopplung geeigneter Subqueries, die urspruenglich als Bestandteile einer komplexen Abfrage fungierten, wird dieses SQL-Statement vereinfacht.</p>
</p>
<div class="wp_syntax" style="padding-bottom: 0px">
<div class="code">
<pre style="font-family: monospace">
WITH   SQ1 AS (SELECT...FROM...WHERE...),
       SQ2 AS (SELECT...FROM...WHERE...)
SELECT...
  FROM Q1, SQ1, SQ2 WHERE…</pre>
</p></div>
</div>
<p>Interessanter Nebeneffekt:</p>
<p>Durch die Verwendung der WITH-Klausel wird anscheinend in einer Systemumgebung mit voreingestelltem CURSOR_SHARING=FORCE offensichtlich fuer die Query-Ausfuehrung diese systemweit gueltige Einstellung auf CURSOR_SHARING=EXACT zurueckgenommen (vergleichbar dem Einsatz des Hint /*+ cursor_sharing_exact */).</p>
<p>Zeigen die QEPs vorher noch eine allgemeine Ersetzung von Konstanten durch Parameter, so weisen die QEPs nachher die direkte Verwendung der Konstanten auf.</p>
<p>Somit orientiert sich der Optimizer auch grundsaetzlich an anderen Zugriffsstrategien.</p>
<p>Was in einer Umgebung mit problematischem Parseverhalten per Bindvariablen-Peeking einen &quot;flüssigen&quot; Anwendungsbetrieb ermöglichen kann, wird im Einzelfall einer komplexen Query unter Verwendung von Attributen mit stark ungleicher Werteverteilung zu relativ kostenintensiven QEPs führen. </p>
<p>Es empfiehlt sich dann für alle entsprechenden Konstanten/Parameter einen separaten und speziellen QEP zu erzwingen. </p>
<p>Vorraussetzung: </p>
<p>SQL-99 Standard bzw. Oracle9i Release 2</p>
<p>Links:</p>
<p><a title="SQLStandards.html" href="http://www.wiscorp.com/SQLStandards.html" target="_blank">SQLStandards.html</a> </p>
<p>to be continued….</p>
]]></content:encoded>
			<wfw:commentRss>http://www.entwicklungsgedanken.de/2010/04/15/with-klausel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Before-Insert/Update Trigger (Performance)</title>
		<link>http://www.entwicklungsgedanken.de/2009/03/27/before-insertupdate-trigger-performance/</link>
		<comments>http://www.entwicklungsgedanken.de/2009/03/27/before-insertupdate-trigger-performance/#comments</comments>
		<pubDate>Fri, 27 Mar 2009 11:22:39 +0000</pubDate>
		<dc:creator>Sven Thämar</dc:creator>
				<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[PL/SQL]]></category>
		<category><![CDATA[Trigger Oracle]]></category>

		<guid isPermaLink="false">http://www.entwicklungsgedanken.de/2009/03/27/before-insertupdate-trigger-performance/</guid>
		<description><![CDATA[Bei der Verwendung von Before-Insert / Update Triggern sollte man bezüglich performance immer prüfen ob eine Wertzuweisung erfolgen muss oder ob der Wert bereits vorhanden ist. Z.b. bei den Feldern create_on bzw. create_by ist eine Zuweisung nur Sinnvoll, wenn die Werte wirklich NULL sind. Ansonsten ist der Performanceverlust bei einer permanenten Zuweisung sehr hoch.]]></description>
			<content:encoded><![CDATA[<p>Bei der Verwendung von Before-Insert / Update Triggern sollte man bezüglich performance immer prüfen ob eine Wertzuweisung erfolgen muss oder ob der Wert bereits vorhanden ist. Z.b. bei den Feldern create_on bzw. create_by ist eine Zuweisung nur Sinnvoll, wenn die Werte wirklich NULL sind. Ansonsten ist der Performanceverlust bei einer permanenten Zuweisung sehr hoch.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.entwicklungsgedanken.de/2009/03/27/before-insertupdate-trigger-performance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>check constraint vs. trigger</title>
		<link>http://www.entwicklungsgedanken.de/2009/03/27/check-constraint-vs-trigger/</link>
		<comments>http://www.entwicklungsgedanken.de/2009/03/27/check-constraint-vs-trigger/#comments</comments>
		<pubDate>Fri, 27 Mar 2009 10:15:34 +0000</pubDate>
		<dc:creator>Sven Thämar</dc:creator>
				<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[PL/SQL]]></category>
		<category><![CDATA[Oracle Trigger check constraint]]></category>

		<guid isPermaLink="false">http://www.entwicklungsgedanken.de/2009/03/27/check-constraint-vs-trigger/</guid>
		<description><![CDATA[Steht bei der Verarbeitung die Geschwindigkeit im Vordergrund, sollte man generell auf die Verwendung von Triggern auf Row-Level Ebene verzichten. Sofern dies möglich ist. Hier ist die Verwendung von check constraints auf alle Fälle vorzuziehen. Wird hingegen von vornherein ein Trigger (Before-Insert / Update) verwendet, kann die Prüfung im Trigger selber erfolgen. Wird ein Trigger [...]]]></description>
			<content:encoded><![CDATA[<p>Steht bei der Verarbeitung die Geschwindigkeit im Vordergrund, sollte man generell auf die Verwendung von Triggern auf Row-Level Ebene verzichten. Sofern dies möglich ist. Hier ist die Verwendung von check constraints auf alle Fälle vorzuziehen. Wird hingegen von vornherein ein Trigger (Before-Insert / Update) verwendet, kann die Prüfung im Trigger selber erfolgen. Wird ein Trigger verwendet sollte man die zusätzlich Prüfung via check constraint nicht verwendet.</p>
<p>Komplette Ausarbeitung: <a href="http://www.entwicklungsgedanken.de/wp-content/uploads/2009/03/check-constraint-vs-trigger2.pdf">QT-check-constraint-vs-trigger</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.entwicklungsgedanken.de/2009/03/27/check-constraint-vs-trigger/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>get-Routinen inkl. cachen unter PL/SQL</title>
		<link>http://www.entwicklungsgedanken.de/2008/04/01/get-routinen-unter-plsql/</link>
		<comments>http://www.entwicklungsgedanken.de/2008/04/01/get-routinen-unter-plsql/#comments</comments>
		<pubDate>Tue, 01 Apr 2008 17:54:20 +0000</pubDate>
		<dc:creator>Sven Thämar</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[PL/SQL]]></category>
		<category><![CDATA[get Oracle PL/SQL]]></category>

		<guid isPermaLink="false">http://www.entwicklungsgedanken.de/2008/04/02/get-routinen-unter-plsql/</guid>
		<description><![CDATA[Dieser Abschnitt befasst sich mit dem Thema des auslesen von Feldinhalten eines Datensatzes einer Tabelle welcher &#252;ber eine ID (i.d.R der PK) angesprochen wird. Die meisten ermitteln den Inhalt einer Spalte ganz Normal &#252;ber eine Cursor-Programmierung innerhalb einer Funktion. Das bedeutet, dass f&#252;r jede Spalte, die ermittelt werden soll, eine Funktion geschrieben wird. Dies erzeugt [...]]]></description>
			<content:encoded><![CDATA[<p>Dieser Abschnitt befasst sich mit dem Thema des auslesen von Feldinhalten eines Datensatzes einer Tabelle welcher &#252;ber eine ID (i.d.R der PK) angesprochen wird.</p>
<p>Die meisten ermitteln den Inhalt einer Spalte ganz Normal &#252;ber eine Cursor-Programmierung innerhalb einer Funktion. Das bedeutet, dass f&#252;r jede Spalte, die ermittelt werden soll, eine Funktion geschrieben wird. Dies erzeugt unn&#246;tigen Sourcecode.</p>
<p>Ein weiterer Vorteil ist das cachen des Records. &#196;ndert sich die ID nicht, so braucht der Record nicht noch mal via Cursor gelesen werden, sondern kann direkt zur&#252;ck gegeben werden. Das kann die Performance (&gt; 50%) unter Umst&#228;nden ziemlich steigern.</p>
<p>Ein effektiverer Weg ist folgender:</p>
<ol>
<li>Aufsetzten eines &quot;get&quot;-Package f&#252;r die jeweiligen Tabellen. </li>
<li>Implementierung einer zentralen &quot;privaten&quot; get-Routine </li>
<li>Implementierung der jeweils ben&#246;tigten &quot;&#246;ffentlichen&quot; get-Routinen. </li>
</ol>
<p>Beispiel:</p>
<p>Tabelle: WARENGRUPPEN</p>
<p>Auszug der Spalten der Tabelle</p>
<ul>
<li>wag_id NUMBER(10,0) </li>
<li>wag_bezeichnung VARCHAR2(100) </li>
<li>wag_kontonr NUMBER(10,0) </li>
<li>wag_status NUMBER(1,0) </li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="plsql" style="font-family:monospace;"><span style="color: #00F;">PACKAGE</span> pgk_wag <span style="color: #00F;">IS</span>
   <span style="color: #00F;">FUNCTION</span> get_bezeichnung<span style="color: #00F;">&#40;</span>pi_id warengruppen<span style="color: #00F;">.</span>wag_id<span style="color: #00F;">%</span><span style="color: #00F;">TYPE</span><span style="color: #00F;">&#41;</span> <span style="color: #00F;">RETURN</span> warengruppen<span style="color: #00F;">.</span>wag_bezeichnung<span style="color: #00F;">%</span><span style="color: #00F;">TYPE</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span> <span style="color: #00F;">FUNCTION</span> get_kontonr<span style="color: #00F;">&#40;</span>pi_id warengruppen<span style="color: #00F;">.</span>wag_id<span style="color: #00F;">%</span><span style="color: #00F;">TYPE</span><span style="color: #00F;">&#41;</span> <span style="color: #00F;">RETURN</span> warengruppen<span style="color: #00F;">.</span>wag_kontonr<span style="color: #00F;">%</span><span style="color: #00F;">TYPE</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span> <span style="color: #00F;">FUNCTION</span> get_status<span style="color: #00F;">&#40;</span>pi_id warengruppen<span style="color: #00F;">.</span>wag_id<span style="color: #00F;">%</span><span style="color: #00F;">TYPE</span><span style="color: #00F;">&#41;</span> <span style="color: #00F;">RETURN</span> warengruppen<span style="color: #00F;">.</span>wag_status<span style="color: #00F;">%</span><span style="color: #00F;">TYPE</span><span style="color: #00F;">;</span>
<span style="color: #00F;">END</span> pkg_wag<span style="color: #00F;">;</span></pre></div></div>

<p>
  </p>

<div class="wp_syntax"><div class="code"><pre class="plsql" style="font-family:monospace;"><span style="color: #00F;">PACKAGE</span> <span style="color: #00F;">BODY</span> pgk_wag <span style="color: #00F;">IS</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="plsql" style="font-family:monospace;">   g_id warengruppen<span style="color: #00F;">.</span>id<span style="color: #00F;">%</span><span style="color: #00F;">TYPE</span><span style="color: #00F;">;&lt;</span>br <span style="color: #00F;">/&gt;</span>   g_record warengruppen<span style="color: #00F;">%</span><span style="color: #00F;">ROWTYPE</span><span style="color: #00F;">;&lt;</span>br <span style="color: #00F;">/&gt;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span> <span style="color: #00F;">FUNCTION</span> get<span style="color: #00F;">&#40;</span>pi_id warengruppen<span style="color: #00F;">.</span>wag_id<span style="color: #00F;">%</span><span style="color: #00F;">TYPE</span><span style="color: #00F;">&#41;</span>
            <span style="color: #00F;">RETURN</span> warengruppen<span style="color: #00F;">.</span>wag_bezeichnung<span style="color: #00F;">%</span><span style="color: #00F;">TYPE</span> IS&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span> <span style="color: #00F;">CURSOR</span> c_rec <span style="color: #00F;">IS</span>
      <span style="color: #00F;">SELECT</span> <span style="color: #00F;">*</span>
        <span style="color: #00F;">FROM</span> warengruppen
       <span style="color: #00F;">WHERE</span> wag_id <span style="color: #00F;">=</span> pi_id<span style="color: #00F;">;</span>
&nbsp;
BEGIN<span style="color: #00F;">&lt;</span>br <span style="color: #00F;">/&gt;</span>   <span style="color: #00F;">IF</span> pi_id &amp;lt<span style="color: #00F;">;</span>&amp;gt<span style="color: #00F;">;</span> g_id THEN<span style="color: #00F;">&lt;</span>br <span style="color: #00F;">/&gt;</span>      g_id <span style="color: #00F;">:=</span> pi_id<span style="color: #00F;">;&lt;</span>br <span style="color: #00F;">/&gt;</span>
      <span style="color: #00F;">OPEN</span> c_rec<span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span> <span style="color: #00F;">FETCH</span> c_rec <span style="color: #00F;">INTO</span> g_record<span style="color: #00F;">;</span>
      <span style="color: #00F;">CLOSE</span> c_rec<span style="color: #00F;">;&lt;</span>br <span style="color: #00F;">/&gt;</span>   <span style="color: #00F;">END</span> <span style="color: #00F;">IF</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span> <span style="color: #00F;">RETURN</span> g_record<span style="color: #00F;">;</span>
<span style="color: #00F;">END</span> get<span style="color: #00F;">;</span>
&nbsp;
<span style="color: #00F;">FUNCTION</span> get_bezeichnung<span style="color: #00F;">&#40;</span>pi_id warengruppen<span style="color: #00F;">.</span>wag_id<span style="color: #00F;">%</span><span style="color: #00F;">TYPE</span><span style="color: #00F;">&#41;</span>
         <span style="color: #00F;">RETURN</span> warengruppen<span style="color: #00F;">.</span>wag_bezeichnung<span style="color: #00F;">%</span><span style="color: #00F;">TYPE</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span> BEGIN&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span> <span style="color: #00F;">RETURN</span> get<span style="color: #00F;">&#40;</span>pi_id<span style="color: #00F;">&#41;</span><span style="color: #00F;">.</span>wag_bezeichnung<span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span> <span style="color: #00F;">END</span> get_bezeichnung<span style="color: #00F;">;</span>
&nbsp;
<span style="color: #00F;">FUNCTION</span> get_kontonr<span style="color: #00F;">&#40;</span>pi_id warengruppen<span style="color: #00F;">.</span>wag_id<span style="color: #00F;">%</span><span style="color: #00F;">TYPE</span><span style="color: #00F;">&#41;</span>
         <span style="color: #00F;">RETURN</span> warengruppen<span style="color: #00F;">.</span>wag_kontonr<span style="color: #00F;">%</span><span style="color: #00F;">TYPE</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span> BEGIN&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span> <span style="color: #00F;">RETURN</span> get<span style="color: #00F;">&#40;</span>pi_id<span style="color: #00F;">&#41;</span><span style="color: #00F;">.</span>wag_kontonr<span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span> <span style="color: #00F;">END</span> get_kontonr<span style="color: #00F;">;</span>
&nbsp;
<span style="color: #00F;">FUNCTION</span> get_status<span style="color: #00F;">&#40;</span>pi_id warengruppen<span style="color: #00F;">.</span>wag_id<span style="color: #00F;">%</span><span style="color: #00F;">TYPE</span><span style="color: #00F;">&#41;</span>
         <span style="color: #00F;">RETURN</span> warengruppen<span style="color: #00F;">.</span>wag_status<span style="color: #00F;">%</span><span style="color: #00F;">TYPE</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span> BEGIN&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span> <span style="color: #00F;">RETURN</span> get<span style="color: #00F;">&#40;</span>pi_id<span style="color: #00F;">&#41;</span><span style="color: #00F;">.</span>wag_status<span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span>&amp;#<span style="color: #800;">160</span><span style="color: #00F;">;</span> <span style="color: #00F;">END</span> get_status<span style="color: #00F;">;&lt;</span>br <span style="color: #00F;">/&gt;&lt;</span>br <span style="color: #00F;">/&gt;&lt;</span>br <span style="color: #00F;">/&gt;</span>
BEGIN<span style="color: #00F;">&lt;</span>br <span style="color: #00F;">/&gt;</span>   g_id <span style="color: #00F;">:=</span> <span style="color: #00F;">-</span><span style="color: #800;">1</span><span style="color: #00F;">;</span>  <span style="color: #080; font-style: italic;">-- Initialisierung der Globalen Hilfsvariable    &lt;br /&gt;END pkg_wag;</span></pre></div></div>

<h4>Vorteil</h4>
<p>Das Package ist schnell erweiterbar und sehr &#252;bersichtlich.</p>
<h4>Nachteil</h4>
<p>Man muss bedenken, dass immer eine Selektion auf alle Spalten des Datensatzes durchgef&#252;hrt wird. Das kann unter Umst&#228;nden den Datenbankserver unn&#246;tig belasten.</p>
<h4>Fazit</h4>
<p>Bei kleinen Hilfstabellen, bis ca. 10 Spalten, sollte man diesen Zugriff ruhig benutzen. Letztendlich lie&#223;t die Datenbank Blockweise die Daten ein und stellt sie dem Anwender zur Verf&#252;gung. Bei gr&#246;&#223;eren Tabellen &gt; 20 Spalten sollte man besser auf die klassische Art der Cursor-Programmierung zur&#252;ckgreifen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.entwicklungsgedanken.de/2008/04/01/get-routinen-unter-plsql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>INSERT INTO via ROWTYPE</title>
		<link>http://www.entwicklungsgedanken.de/2008/01/09/insert-into-rowtype/</link>
		<comments>http://www.entwicklungsgedanken.de/2008/01/09/insert-into-rowtype/#comments</comments>
		<pubDate>Wed, 09 Jan 2008 19:51:11 +0000</pubDate>
		<dc:creator>Sven Thämar</dc:creator>
				<category><![CDATA[PL/SQL]]></category>
		<category><![CDATA[INSERT INTO ROWTYPE]]></category>

		<guid isPermaLink="false">http://www.entwicklungsgedanken.de/2008/01/09/insert-into-rowtype/</guid>
		<description><![CDATA[Allgemein Ab der Oracle Datenbank Version 9.2 ist das INSERT-Statement um eine weitere funktionalität Erweitert worden. Es ist nun möglich, an eine Insert-Anweisung, statt einzelner Felder, einen kompletten Record zu übergeben. Dieser Record muss dabei die gleiche Struktur wie die entsprechende Tabelle widerspiegeln. Jedoch dürfen dabei einzelne Felder leer bleiben. Der Vorteil dieser erweiterten funktionalität [...]]]></description>
			<content:encoded><![CDATA[<div class="lang-de"></div>
<h3>Allgemein</h3>
<p>Ab der Oracle Datenbank Version 9.2 ist das INSERT-Statement um eine weitere funktionalität Erweitert worden. Es ist nun möglich, an eine Insert-Anweisung, statt einzelner Felder, einen kompletten Record zu übergeben. Dieser Record muss dabei die gleiche Struktur wie die entsprechende Tabelle widerspiegeln. Jedoch dürfen dabei einzelne Felder leer bleiben.</p>
<p>Der Vorteil dieser erweiterten funktionalität liegt vor allem daran, wenn man ein INSERT-Statement in eine Prozedur/Funktion einbettet und einen Datensatz als Parameter übergibt. Dadurch kann die Tabelle ohne Probleme erweitert/geändert werden ohne das der Parameter angepasst werden muss. D.h die Signatur der Prozedur/Funktion bleibt unverändert.</p>
<h3>Source Code</h3>
<p>Prozedur zum einfügen eines Datensatzes via ROWTYPE.</p>

<div class="wp_syntax"><div class="code"><pre class="plsql" style="font-family:monospace;"><span style="color: #00F;">PROCEDURE</span> do_insert<span style="color: #00F;">&#40;</span>pi_rec hr<span style="color: #00F;">.</span>employees<span style="color: #00F;">%</span><span style="color: #00F;">ROWTYPE</span><span style="color: #00F;">&#41;</span> <span style="color: #00F;">IS</span> 
<span style="color: #00F;">BEGIN</span> 
   <span style="color: #00F;">INSERT</span> <span style="color: #00F;">INTO</span> hr<span style="color: #00F;">.</span>employees <span style="color: #00F;">VALUES</span> pi_rec<span style="color: #00F;">;</span> 
   <span style="color: #00F;">COMMIT</span><span style="color: #00F;">;</span> 
<span style="color: #00F;">END</span> do_insert<span style="color: #00F;">;</span></pre></div></div>

<p>Prozedur zum initialisieren der Felder.</p>

<div class="wp_syntax"><div class="code"><pre class="plsql" style="font-family:monospace;"><span style="color: #00F;">PROCEDURE</span> initialisierung <span style="color: #00F;">IS</span> 
   l_rec hr<span style="color: #00F;">.</span>employees<span style="color: #00F;">%</span><span style="color: #00F;">ROWTYPE</span><span style="color: #00F;">;</span> 
<span style="color: #00F;">BEGIN</span> 
   <span style="color: #080; font-style: italic;">-- Der Inhalt des Feldes &quot;employee_id&quot; wird durch ein INSERT-Trigger gesetzt. </span>
   <span style="color: #080; font-style: italic;">-- Die Inhalte der Felder &quot;email&quot;, &quot;phone_number&quot; und &quot;commission_pct&quot; bleiben leer. </span>
   l_rec<span style="color: #00F;">.</span>first_name <span style="color: #00F;">:=</span> <span style="color: #F00;">'Max'</span><span style="color: #00F;">;</span> 
   l_rec<span style="color: #00F;">.</span>last_name <span style="color: #00F;">:=</span> <span style="color: #F00;">'Mustermann'</span><span style="color: #00F;">;</span> 
   l_rec<span style="color: #00F;">.</span>hire_date <span style="color: #00F;">:=</span> <span style="color: #000;">SYSDATE</span><span style="color: #00F;">;</span> 
   l_rec<span style="color: #00F;">.</span>job_id <span style="color: #00F;">:=</span> <span style="color: #F00;">'IT-PROG'</span><span style="color: #00F;">;</span> 
   l_rec<span style="color: #00F;">.</span>salary <span style="color: #00F;">:=</span> <span style="color: #800;">4800</span><span style="color: #00F;">;</span> 
   l_rec<span style="color: #00F;">.</span>manager_it <span style="color: #00F;">:=</span> <span style="color: #800;">103</span><span style="color: #00F;">;</span> 
   l_rec<span style="color: #00F;">.</span>department_id <span style="color: #00F;">:=</span> <span style="color: #800;">60</span><span style="color: #00F;">;</span>  
&nbsp;
   do_insert<span style="color: #00F;">&#40;</span>l_rec<span style="color: #00F;">&#41;</span><span style="color: #00F;">;</span> 
<span style="color: #00F;">END</span> initialisierung<span style="color: #00F;">;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.entwicklungsgedanken.de/2008/01/09/insert-into-rowtype/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
