Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie verwendet man die globale temporäre Tabelle im Oracle-Verfahren?

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?