<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://entorb.net//wiki/index.php?action=history&amp;feed=atom&amp;title=Oracle_PL%2FSQL</id>
	<title>Oracle PL/SQL - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://entorb.net//wiki/index.php?action=history&amp;feed=atom&amp;title=Oracle_PL%2FSQL"/>
	<link rel="alternate" type="text/html" href="https://entorb.net//wiki/index.php?title=Oracle_PL/SQL&amp;action=history"/>
	<updated>2026-05-06T10:24:18Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://entorb.net//wiki/index.php?title=Oracle_PL/SQL&amp;diff=4894&amp;oldid=prev</id>
		<title>Torben at 20:43, 30 October 2024</title>
		<link rel="alternate" type="text/html" href="https://entorb.net//wiki/index.php?title=Oracle_PL/SQL&amp;diff=4894&amp;oldid=prev"/>
		<updated>2024-10-30T20:43:44Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:Coding]]&lt;br /&gt;
====Minimalbeispiel====&lt;br /&gt;
 BEGIN&lt;br /&gt;
   FOR rec IN (SELECT ghi.id FROM geraetehistorien ghi WHERE ghi.id &amp;lt; 500) LOOP&lt;br /&gt;
     dbms_output.put_line(rec.id);&lt;br /&gt;
     pkg_ghi.prc_del_ghi_eintrag(p_ghi_id =&amp;gt; rec.id);&lt;br /&gt;
   END LOOP;&lt;br /&gt;
 END;&lt;br /&gt;
 /&lt;br /&gt;
====Sauberes Arbeiten mit Testmodus und Protokollierung====&lt;br /&gt;
 -- 2. Sauber arbeiten mit Testmodus und Protokollierung&lt;br /&gt;
 &lt;br /&gt;
 DECLARE&lt;br /&gt;
   l_test CONSTANT BOOLEAN := TRUE; -- TODO: Testmodus&lt;br /&gt;
 &lt;br /&gt;
   l_err         VARCHAR2(1000) := NULL;&lt;br /&gt;
   l_commit      BOOLEAN := TRUE; -- wird bei Problemen mit false überschrieben, nie mit true befüllt&lt;br /&gt;
   l_output      VARCHAR2(1000);&lt;br /&gt;
   l_count       NUMBER := 0;&lt;br /&gt;
   l_count_good  NUMBER := 0;&lt;br /&gt;
   l_count_error NUMBER := 0;&lt;br /&gt;
 &lt;br /&gt;
 BEGIN&lt;br /&gt;
   -- dbms_output.enable; -- verhindert Pufferüberlauf wenn als Procedure gestartet.&lt;br /&gt;
   &lt;br /&gt;
   --&lt;br /&gt;
   -- Eine Beispielschleife&lt;br /&gt;
   --&lt;br /&gt;
   l_output := &amp;#039;Nr&amp;#039; || &amp;#039; ; &amp;#039; || &amp;#039;ID&amp;#039;;&lt;br /&gt;
   dbms_output.put_line(l_output);&lt;br /&gt;
   FOR rec IN (SELECT ghi.id FROM geraetehistorien ghi WHERE ghi.id &amp;lt; 500) LOOP&lt;br /&gt;
     BEGIN&lt;br /&gt;
       -- neuer BEGIN-Block um hier gesondert Exceptions zu fangen&lt;br /&gt;
       l_err   := NULL; -- Viele Prozeduren geben Fehlermeldungen zurück, mit diesen ist dann l_err zu füllen&lt;br /&gt;
       l_count := l_count + 1;&lt;br /&gt;
       -- &lt;br /&gt;
       -- Hauptteil z.B.: erst Ausgabe, dann GHI Löschen&lt;br /&gt;
       --&lt;br /&gt;
       l_output := l_count || &amp;#039; ; &amp;#039; || rec.id; -- hier eine Ausgabevariable für DBMS Put Line und Protokoll setzen&lt;br /&gt;
       dbms_output.put_line(l_output);&lt;br /&gt;
     &lt;br /&gt;
     &lt;br /&gt;
       -- &lt;br /&gt;
       -- Ende Hauptteil&lt;br /&gt;
       --&lt;br /&gt;
     &lt;br /&gt;
       --&lt;br /&gt;
       -- Fehlerbehandlung etc&lt;br /&gt;
       --&lt;br /&gt;
       IF l_err IS NOT NULL THEN&lt;br /&gt;
         l_commit      := FALSE;&lt;br /&gt;
         l_count_error := l_count_error + 1;&lt;br /&gt;
       ELSE&lt;br /&gt;
         l_count_good := l_count_good + 1;&lt;br /&gt;
       END IF;&lt;br /&gt;
     EXCEPTION&lt;br /&gt;
       WHEN OTHERS THEN&lt;br /&gt;
         l_commit      := FALSE;&lt;br /&gt;
         l_count_error := l_count_error + 1;&lt;br /&gt;
         l_output      := &amp;#039;ERROR: &amp;#039; || SQLERRM;&lt;br /&gt;
         dbms_output.put_line(l_output);&lt;br /&gt;
     END; -- block innerhalb for schleife&lt;br /&gt;
   END LOOP;&lt;br /&gt;
 &lt;br /&gt;
   -- commit erst am Ende, und nur wenn keine Fehler und kein Testmodus&lt;br /&gt;
   IF l_commit = TRUE THEN&lt;br /&gt;
     l_output := &amp;#039;No Errors&amp;#039;;&lt;br /&gt;
     dbms_output.put_line(l_output);&lt;br /&gt;
     IF l_test THEN&lt;br /&gt;
       l_output := &amp;#039;TEST -&amp;gt; ROLLBACK of all statements&amp;#039;;&lt;br /&gt;
       dbms_output.put_line(l_output);&lt;br /&gt;
       ROLLBACK;&lt;br /&gt;
     ELSE&lt;br /&gt;
       l_output := &amp;#039;COMMIT&amp;#039;;&lt;br /&gt;
       dbms_output.put_line(l_output);&lt;br /&gt;
       COMMIT;&lt;br /&gt;
     END IF;&lt;br /&gt;
   ELSE&lt;br /&gt;
     -- l_commit ist nicht gesetzt, weil Fehler&lt;br /&gt;
     l_output := &amp;#039;ERRORS -&amp;gt; ROLLBACK&amp;#039;;&lt;br /&gt;
     dbms_output.put_line(l_output);&lt;br /&gt;
     ROLLBACK;&lt;br /&gt;
   END IF;&lt;br /&gt;
 &lt;br /&gt;
   --&lt;br /&gt;
   -- Zusammenfassung&lt;br /&gt;
   --&lt;br /&gt;
   dbms_output.put_line(l_lpl_id, &amp;#039;-- &amp;#039;);&lt;br /&gt;
   dbms_output.put_line(l_lpl_id, &amp;#039;-- Zusammenfassung&amp;#039;);&lt;br /&gt;
   dbms_output.put_line(l_lpl_id, &amp;#039;-- bearbeitet: &amp;#039; || l_count);&lt;br /&gt;
   dbms_output.put_line(l_lpl_id, &amp;#039;-- gut       : &amp;#039; || l_count_good);&lt;br /&gt;
   dbms_output.put_line(l_lpl_id, &amp;#039;-- fehlerhaft: &amp;#039; || l_count_error);&lt;br /&gt;
   dbms_output.put_line(l_lpl_id, &amp;#039;-- &amp;#039;);&lt;br /&gt;
 &lt;br /&gt;
   --&lt;br /&gt;
   -- Exeptions&lt;br /&gt;
   --&lt;br /&gt;
 EXCEPTION&lt;br /&gt;
   WHEN OTHERS THEN&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE(&amp;#039;ERROR: &amp;#039; || SQLCODE || &amp;#039; - &amp;#039; || SQLERRM);&lt;br /&gt;
     ROLLBACK;&lt;br /&gt;
 END;&lt;br /&gt;
 /&lt;br /&gt;
&lt;br /&gt;
====Ausgabe====&lt;br /&gt;
 -- SET SERVEROUTPUT ON -- dbms output aktivieren im SQL-Developer (PL/SQL-Dev macht das automatisch)&lt;br /&gt;
 DECLARE&lt;br /&gt;
   ln_num  NUMBER;&lt;br /&gt;
   lv_text VARCHAR2(32);&lt;br /&gt;
 BEGIN&lt;br /&gt;
   ln_num := 12345;&lt;br /&gt;
   lv_text := &amp;#039;qwertz&amp;#039;;&lt;br /&gt;
   dbms_output.put_line(&amp;#039;ln_num = &amp;#039; || ln_num || &amp;#039;, lv_text = &amp;#039; || lv_text);&lt;br /&gt;
 END;&lt;br /&gt;
 /&lt;br /&gt;
&lt;br /&gt;
====Variablen====&lt;br /&gt;
 /*&lt;br /&gt;
 Variablennamenskonvention &lt;br /&gt;
 1. Stelle: Lokale vs. Übergabevariable&lt;br /&gt;
  - Lokale (deklarierte) Variablen mit ‚l‘ beginnend&lt;br /&gt;
  - Prozedur-Übergabe Variablen mit ‚p‘ beginnend&lt;br /&gt;
 2. Stelle: Typ&lt;br /&gt;
  - n für Number&lt;br /&gt;
  - V für Varchar2 (String/Zeichenkette)&lt;br /&gt;
  - B für Boolean (true/false)&lt;br /&gt;
 3… Stelle: ‚_Bezeichnung‘&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
 -- Minimalbeispiel&lt;br /&gt;
 DECLARE -- kann weggelassen werden wenn nichts zu deklarieren&lt;br /&gt;
   ln_num NUMBER := 0;&lt;br /&gt;
   ln_num2 CONSTANT NUMBER := 123;&lt;br /&gt;
 BEGIN&lt;br /&gt;
   ln_num := 12345;&lt;br /&gt;
 EXCEPTION&lt;br /&gt;
   WHEN OTHERS THEN&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE(&amp;#039;ERROR: &amp;#039; || SQLCODE || &amp;#039; - &amp;#039; || SQLERRM);&lt;br /&gt;
 END;&lt;br /&gt;
 /&lt;br /&gt;
 &lt;br /&gt;
 /*&lt;br /&gt;
 Zwischen BEGIN und END können weitere gekapselte &lt;br /&gt;
 DECLARE&lt;br /&gt;
 BEGIN&lt;br /&gt;
 EXCEPTION&lt;br /&gt;
 END &lt;br /&gt;
 -Blöcke eingefügt werden, Beispiel siehe Schleife mit Exception-Behandlung&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 -- Variablen 1&lt;br /&gt;
 DECLARE&lt;br /&gt;
   ln_num number;&lt;br /&gt;
   lv_text VARCHAR2(32);&lt;br /&gt;
 BEGIN&lt;br /&gt;
   ln_num := 12345;&lt;br /&gt;
   dbms_output.put_line(&amp;#039;num = &amp;#039; || ln_num);&lt;br /&gt;
   lv_text := &amp;#039;qwertz&amp;#039;;&lt;br /&gt;
   dbms_output.put_line(&amp;#039;text = &amp;#039; || lv_text);&lt;br /&gt;
 END;&lt;br /&gt;
 /&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 -- Variablen 2 - Via SQL befüllen&lt;br /&gt;
 DECLARE&lt;br /&gt;
   ln_lpl_id    lineare_protokolle.id%type;           -- %TYPE liest den Variablentyp aus der Tabellenspalte aus -&amp;gt; SEHR praktisch!&lt;br /&gt;
   lv_lpl_titel lineare_protokolle.beschreibung%TYPE;&lt;br /&gt;
 BEGIN&lt;br /&gt;
   SELECT t.id, t.beschreibung&lt;br /&gt;
     INTO ln_lpl_id, lv_lpl_titel&lt;br /&gt;
     FROM lineare_protokolle t&lt;br /&gt;
    WHERE t.id = (SELECT MAX(id) FROM lineare_protokolle);&lt;br /&gt;
   dbms_output.put_line(&amp;#039;ID = &amp;#039; || ln_lpl_id || &amp;#039;, Titel = &amp;#039; || lv_lpl_titel);&lt;br /&gt;
 END;&lt;br /&gt;
 /&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 -- Variablen 3 - Insert in DB&lt;br /&gt;
 DECLARE&lt;br /&gt;
   ln_num lineare_protokolle.id%TYPE;&lt;br /&gt;
   lv_lpl_titel lineare_protokolle.beschreibung%TYPE;&lt;br /&gt;
 BEGIN&lt;br /&gt;
 ln_num := 12345;&lt;br /&gt;
 lv_lpl_titel := &amp;#039;asdfg&amp;#039;;&lt;br /&gt;
   insert into lineare_protokolle(id,beschreibung) values (ln_num,lv_lpl_titel);&lt;br /&gt;
 END;&lt;br /&gt;
 /&lt;br /&gt;
 &lt;br /&gt;
 -- Variablen 4 - Update in DB&lt;br /&gt;
 DECLARE&lt;br /&gt;
   ln_num tabelle.spalte1%TYPE := 0;&lt;br /&gt;
 BEGIN&lt;br /&gt;
   UPDATE tabelle&lt;br /&gt;
      SET (spalte1) = (ln_num)&lt;br /&gt;
    WHERE spalte2 = 123; --filter&lt;br /&gt;
 END;&lt;br /&gt;
 /&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 -- Löschen mit RowCount&lt;br /&gt;
 declare&lt;br /&gt;
   ln_num tab.spalte1%TYPE := 0;&lt;br /&gt;
   ln_num_del number;&lt;br /&gt;
 BEGIN&lt;br /&gt;
   DELETE FROM employees WHERE employee_id = ln_num;&lt;br /&gt;
   ln_num_del := SQL%ROWCOUNT;&lt;br /&gt;
   DBMS_OUTPUT.PUT_LINE(ln_num_del   || &amp;#039; rows deleted.&amp;#039;);&lt;br /&gt;
   DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT || &amp;#039; rows deleted.&amp;#039;);&lt;br /&gt;
 END;&lt;br /&gt;
&lt;br /&gt;
====Schleifen====&lt;br /&gt;
 -- Prozedur ausführen&lt;br /&gt;
 BEGIN&lt;br /&gt;
     pkg_ghi.prc_del_ghi_eintrag(p_ghi_id =&amp;gt; 123123123);&lt;br /&gt;
 END;&lt;br /&gt;
 /&lt;br /&gt;
 &lt;br /&gt;
 -- Besser Exceptions fangen und ausgeben&lt;br /&gt;
 BEGIN&lt;br /&gt;
     pkg_ghi.prc_del_ghi_eintrag(p_ghi_id =&amp;gt; 123123123);&lt;br /&gt;
 EXCEPTION&lt;br /&gt;
   WHEN OTHERS THEN&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE(&amp;#039;ERROR: &amp;#039; || SQLCODE || &amp;#039; - &amp;#039; || SQLERRM);&lt;br /&gt;
 END;&lt;br /&gt;
 /	&lt;br /&gt;
 &lt;br /&gt;
 -- For-Schleife - Minimalbeispiel&lt;br /&gt;
 BEGIN&lt;br /&gt;
   FOR rec IN (SELECT * FROM geraetehistorien ghi WHERE ghi.id &amp;lt; 500) LOOP&lt;br /&gt;
     dbms_output.put_line(rec.id);&lt;br /&gt;
     -- pkg_ghi.prc_del_ghi_eintrag(p_ghi_id =&amp;gt; rec.id);&lt;br /&gt;
   END LOOP;&lt;br /&gt;
 EXCEPTION&lt;br /&gt;
   WHEN OTHERS THEN&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE(&amp;#039;ERROR: &amp;#039; || SQLCODE || &amp;#039; - &amp;#039; || SQLERRM);&lt;br /&gt;
 END;&lt;br /&gt;
 /&lt;br /&gt;
 &lt;br /&gt;
 -- For-Schleife mit If-Else&lt;br /&gt;
 BEGIN&lt;br /&gt;
   FOR rec IN (SELECT ghi.id FROM geraetehistorien ghi WHERE ghi.id &amp;lt; 500) LOOP&lt;br /&gt;
     IF (rec.id &amp;gt; 500) THEN&lt;br /&gt;
       dbms_output.put_line(&amp;#039;lösche GHI-ID &amp;#039; || rec.id);&lt;br /&gt;
       -- pkg_ghi.prc_del_ghi_eintrag(p_ghi_id =&amp;gt; rec.id);&lt;br /&gt;
     ELSE&lt;br /&gt;
       dbms_output.put_line(&amp;#039;lösche GHI-ID &amp;#039; || rec.id || &amp;#039; nicht&amp;#039;);&lt;br /&gt;
     END IF;&lt;br /&gt;
   END LOOP;&lt;br /&gt;
 EXCEPTION&lt;br /&gt;
   WHEN OTHERS THEN&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE(&amp;#039;ERROR: &amp;#039; || SQLCODE || &amp;#039; - &amp;#039; || SQLERRM);&lt;br /&gt;
 END;&lt;br /&gt;
 /&lt;br /&gt;
 &lt;br /&gt;
 -- For-Schleife mit EXCEPTION-Behandlung im Loop (Macht nach Fehler weiter)&lt;br /&gt;
 BEGIN&lt;br /&gt;
   FOR rec IN (SELECT ghi.id FROM geraetehistorien ghi WHERE ghi.id &amp;lt; 500) LOOP&lt;br /&gt;
     BEGIN&lt;br /&gt;
       -- separater Beginn Block, für Exceptions&lt;br /&gt;
       -- pkg_ghi.prc_del_ghi_eintrag(p_ghi_id =&amp;gt; rec.id);&lt;br /&gt;
       dbms_output.put_line(&amp;#039;lösche GHI-ID &amp;#039; || rec.id);&lt;br /&gt;
     EXCEPTION&lt;br /&gt;
       WHEN OTHERS THEN&lt;br /&gt;
         DBMS_OUTPUT.PUT_LINE(&amp;#039;ERROR: &amp;#039; || SQLCODE || &amp;#039; - &amp;#039; || SQLERRM);&lt;br /&gt;
     END; -- innerer Begin Block&lt;br /&gt;
   END LOOP;&lt;br /&gt;
 END;&lt;br /&gt;
 /&lt;br /&gt;
 &lt;br /&gt;
 -- Schleife über Liste von Werten&lt;br /&gt;
 -- http://www.knaupes.net/oracle-plsql-for-schleife/&lt;br /&gt;
 DECLARE&lt;br /&gt;
   TYPE person IS RECORD(&lt;br /&gt;
     LAST_NAME VARCHAR2(16),&lt;br /&gt;
     AGE       NUMBER);&lt;br /&gt;
   TYPE personTab IS TABLE OF person;&lt;br /&gt;
   vPersons personTab := personTab();&lt;br /&gt;
 BEGIN&lt;br /&gt;
   -- befüllen der Tabelle&lt;br /&gt;
   vPersons.extend;&lt;br /&gt;
   vPersons(1).LAST_NAME := &amp;#039;KING&amp;#039;;&lt;br /&gt;
   vPersons(1).AGE := &amp;#039;32&amp;#039;;&lt;br /&gt;
   vPersons.extend;&lt;br /&gt;
   vPersons(2).LAST_NAME := &amp;#039;QUEEN&amp;#039;;&lt;br /&gt;
   vPersons(2).AGE := &amp;#039;31&amp;#039;;&lt;br /&gt;
   FOR i IN vPersons.first .. vPersons.last LOOP&lt;br /&gt;
     dbms_output.put_line(vPersons(i).LAST_NAME || &amp;#039; - &amp;#039; || vPersons(i).AGE);&lt;br /&gt;
   END LOOP;&lt;br /&gt;
 EXCEPTION&lt;br /&gt;
   WHEN OTHERS THEN&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE(&amp;#039;ERROR: &amp;#039; || SQLCODE || &amp;#039; - &amp;#039; || SQLERRM);&lt;br /&gt;
 END;&lt;br /&gt;
&lt;br /&gt;
====Prozeduren====&lt;br /&gt;
 --erstellen und in DB speichern&lt;br /&gt;
 CREATE OR REPLACE PROCEDURE myproc(pn_card_id NUMBER, pv_loc varchar2) is&lt;br /&gt;
   ln_counter number;&lt;br /&gt;
 BEGIN&lt;br /&gt;
   ln_counter := ln_counter + 1;&lt;br /&gt;
   INSERT INTO tab1 VALUES (pn_card_id, pv_loc);&lt;br /&gt;
 end myproc;&lt;br /&gt;
 /&lt;br /&gt;
 &lt;br /&gt;
 --ausführen&lt;br /&gt;
 begin&lt;br /&gt;
 myproc(pn_card_id =&amp;gt; 123, pv_loc =&amp;gt; &amp;#039;test&amp;#039;);&lt;br /&gt;
 end;&lt;br /&gt;
 /&lt;br /&gt;
 &lt;br /&gt;
 --löschen&lt;br /&gt;
 drop PROCEDURE myproc;&lt;br /&gt;
 &lt;br /&gt;
 -- Procedure in Anonymen Block verwenden&lt;br /&gt;
 DECLARE&lt;br /&gt;
   lv_text VARCHAR2(16) := &amp;#039;asdfg&amp;#039;;&lt;br /&gt;
   PROCEDURE myproc(pn_card_id NUMBER, pv_loc NUMBER) IS&lt;br /&gt;
     ln_counter NUMBER := 0;&lt;br /&gt;
   BEGIN&lt;br /&gt;
     ln_counter := ln_counter + 1;&lt;br /&gt;
     INSERT INTO tab1 VALUES (pn_card_id, pv_loc);&lt;br /&gt;
   END myproc;&lt;br /&gt;
 BEGIN&lt;br /&gt;
   myproc(123, lv_text);&lt;br /&gt;
 END;&lt;br /&gt;
 /&lt;br /&gt;
 &lt;br /&gt;
 -- Exception Rückgabe aus Prozedur raus&lt;br /&gt;
 CREATE OR REPLACE PROCEDURE myproc (pn_card_id IN NUMBER, pv_loc IN NUMBER, pv_error OUT varchar2) is&lt;br /&gt;
   ln_counter number := 0;&lt;br /&gt;
 BEGIN&lt;br /&gt;
   pv_error := null;&lt;br /&gt;
   ln_counter := ln_counter + 1;&lt;br /&gt;
   INSERT INTO tab1 VALUES (pn_card_id, pv_loc);&lt;br /&gt;
 EXCEPTION&lt;br /&gt;
   WHEN OTHERS THEN&lt;br /&gt;
     pv_error := &amp;#039;ERROR: &amp;#039; || SQLCODE || &amp;#039; - &amp;#039; || SQLERRM;&lt;br /&gt;
 end myproc;&lt;br /&gt;
 /&lt;br /&gt;
&lt;br /&gt;
====Performance Tipps====&lt;br /&gt;
 -- fastest: plain SQL&lt;br /&gt;
 INSERT all&lt;br /&gt;
    INTO tab1 (owner, table_name) VALUES (&amp;#039;EC_ANF&amp;#039;, &amp;#039;ANFRAGEN&amp;#039;)&lt;br /&gt;
    INTO tab1 (owner, table_name) VALUES (&amp;#039;EC_ANF&amp;#039;, &amp;#039;ANFRAGE_PARAMETER&amp;#039;)&lt;br /&gt;
    INTO tab1 (owner, table_name) VALUES (&amp;#039;EC_ANF&amp;#039;, &amp;#039;ANFRAGEVERMERKE&amp;#039;)&lt;br /&gt;
    INTO tab1 (owner, table_name) VALUES (&amp;#039;EC_ANF&amp;#039;, &amp;#039;KUNDEN&amp;#039;)&lt;br /&gt;
  SELECT 1 FROM DUAL; -- select muss hier sein&lt;br /&gt;
  &lt;br /&gt;
 -- slow: Context switches SQL to PL/SQL&lt;br /&gt;
 FOR I IN 1..5600 LOOP&lt;br /&gt;
   SELECT product_id, warehouse_id&lt;br /&gt;
   INTO vn_p_id, vn_wh_id&lt;br /&gt;
   FROM big_inventories WHERE v_p_id = I;&lt;br /&gt;
   INSERT INTO inventories2 VALUES(vn_p_id, vn_wh_id);&lt;br /&gt;
 END LOOP&lt;br /&gt;
 &lt;br /&gt;
 -- better: via Cursor&lt;br /&gt;
 DECLARE&lt;br /&gt;
   CURSOR cv_raise IS&lt;br /&gt;
     SELECT deptno, increase FROM emp_raise;&lt;br /&gt;
 BEGIN&lt;br /&gt;
   FOR dept IN cv_raise LOOP&lt;br /&gt;
     UPDATE big_emp SET sal = sal * dept.increase WHERE deptno = dept.deptno;&lt;br /&gt;
   END LOOP;&lt;br /&gt;
 &lt;br /&gt;
 -- Bulk Collect&lt;br /&gt;
 CREATE PROCEDURE get_departments(p_loc NUMBER) IS&lt;br /&gt;
   TYPE dept_tab_type IS TABLE OF departments%ROWTYPE;&lt;br /&gt;
   v_depts dept_tab_type;&lt;br /&gt;
 BEGIN&lt;br /&gt;
   SELECT * BULK COLLECT INTO v_depts FROM departments WHERE location_id = p_loc;&lt;br /&gt;
   FOR i IN 1 .. v_depts.COUNT LOOP&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE(v_depts(i).department_id || &amp;#039; &amp;#039; || v_depts(i).department_name);&lt;br /&gt;
   END LOOP;&lt;br /&gt;
 END;&lt;br /&gt;
 &lt;br /&gt;
 -- Bulk Binding&lt;br /&gt;
 FORALL i IN v_id.FIRST .. v_id.LAST&lt;br /&gt;
   UPDATE employees&lt;br /&gt;
      SET salary = (1 + p_percent / 100) * salary&lt;br /&gt;
    WHERE employee_id = v_id(i);&lt;br /&gt;
 END;&lt;/div&gt;</summary>
		<author><name>Torben</name></author>
	</entry>
</feed>