sql >> Database >  >> RDS >> Oracle

Hoe gebruik ik een globale tijdelijke tabel in de Oracle-procedure?

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?
  1. Compatibiliteitsniveaus en Cardinality Estimation Primer

  2. een aantal unieke waarden krijgen zonder waarden te scheiden die tot hetzelfde waardenblok behoren

  3. Hoge beschikbaarheid van PostgreSQL met master-slave- en master-masterarchitecturen

  4. MariaDB CURRENT_USER() uitgelegd