In Oracle, globale tijdelijke tabellen, ook wel sessietabellen genoemd, en we gebruiken globale tijdelijke tabellen om de gegevens er tijdelijk in te bewaren tijdens de verwerking. Het onderstaande is een voorbeeld.
Maak een globale tijdelijke tabel
Hier zullen we een globale tijdelijke tabel maken om het totale salaris per afdeling vast te houden uit de EMP-tabel. U kunt de EMP-tabel en de gegevens downloaden voor testdoeleinden van de volgende link SCOTT Schema Tables. In het onderstaande voorbeeld maken we ook de tabel met ON COMMIT DELETE ROWS clausule, om de rijen te verwijderen wanneer een Commit-instructie in de procedure wordt uitgevoerd. U kunt ook de ON COMMIT PRESERVE RIJEN . gebruiken clausule om de rijen in de tabel te bewaren totdat de sessie actief is.
CREATE GLOBAL TEMPORARY TABLE temp_dept ( deptno NUMBER (4), dname VARCHAR2 (50), sal NUMBER ) ON COMMIT DELETE ROWS;
Voorbeeld om globale tijdelijke tabel te gebruiken in Oracle-procedure
De volgende procedure neemt het totale salaris van elke afdeling en vult de tabel temp_dept. Vervolgens worden de records geselecteerd uit een temp_dept-tabel en wordt de kolom EMP-tabelcommissie geüpdatet met 2% van het totale afdelingssalaris.
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; /
Uitvoer
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.
Zie ook:
- Tabeltype in voorbeeld opgeslagen procedure
- Hoe vergelijk je twee objecten in Oracle?