In Oracle werden globale temporäre Tabellen als Sitzungstabellen bezeichnet, und wir verwenden globale temporäre Tabellen, um die Daten während der Verarbeitung vorübergehend darin zu halten. Unten sehen Sie ein Beispiel.
Erstellen Sie eine globale temporäre Tabelle
Hier erstellen wir eine globale temporäre Tabelle, um das abteilungsbezogene Gesamtgehalt aus der EMP-Tabelle zu speichern. Sie können die EMP-Tabelle und die Daten herunterladen zu Testzwecken aus dem folgenden Link SCOTT Schema Tables. Außerdem erstellen wir im folgenden Beispiel die Tabelle mit ON COMMIT DELETE ROWS -Klausel, um die Zeilen zu löschen, wenn eine Commit-Anweisung in der Prozedur ausgeführt wird. Sie können auch die ON COMMIT PRESERVE ROWS verwenden -Klausel, um die Zeilen in der Tabelle beizubehalten, bis die Sitzung aktiv ist.
CREATE GLOBAL TEMPORARY TABLE temp_dept ( deptno NUMBER (4), dname VARCHAR2 (50), sal NUMBER ) ON COMMIT DELETE ROWS;
Beispiel für die Verwendung einer globalen temporären Tabelle in einer Oracle-Prozedur
Das folgende Verfahren nimmt das Gesamtgehalt jeder Abteilung und füllt die Tabelle temp_dept. Anschließend wählt er die Datensätze aus einer Tabelle „temp_dept“ aus und aktualisiert die Provisionsspalte der EMP-Tabelle mit 2 % des Gesamtgehalts der Abteilung.
CREATE OR REPLACE PROCEDURE prc_dept IS CURSOR c_emp IS SELECT e.deptno, d.dname, SUM (e.sal) tot_sal FROM emp e, dept d WHERE e.deptno = d.deptno GROUP BY e.deptno, d.dname; n_count NUMBER := 0; BEGIN FOR c IN c_emp LOOP /* Inserting records into temp table */ INSERT INTO temp_dept (deptno, dname, sal) VALUES (c.deptno, c.dname, c.tot_sal); END LOOP; /* Now get the records from temp table and update the EMP table */ FOR c IN (SELECT deptno, dname, sal FROM temp_dept) LOOP /* Updating the EMP table commission column to set 2% of total department wise salary*/ UPDATE emp SET comm = c.sal * 2 / 100 WHERE emp.deptno = c.deptno; DBMS_OUTPUT.put_line( 'Commission amount ' || (c.sal * 2 / 100) || ' updated for department ' || c.dname); END LOOP; /* Save the EMP table changes and this will also remove the records from temp_dept table*/ COMMIT; /* Checking temporary table records count for testing */ SELECT COUNT ( * ) INTO n_count FROM temp_dept; DBMS_OUTPUT.put_Line ('Records in Temp table: ' || n_count); END;
Test
SET SERVEROUTPUT ON; BEGIN prc_dept; END; /
Ausgabe
Commission amount 175 updated for department ACCOUNTING Commission amount 217.5 updated for department RESEARCH Commission amount 188 updated for department SALES Records in Temp table: 0 PL/SQL procedure successfully completed.
Siehe auch:
- Beispiel für Tabellentyp in gespeicherter Prozedur
- Wie vergleiche ich zwei Objekte in Oracle?