Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment utiliser la table temporaire globale dans la procédure Oracle ?

Dans Oracle, les tables temporaires globales sont appelées tables de session et nous utilisons des tables temporaires globales pour y conserver temporairement les données pendant le traitement. Ci-dessous un exemple.

Créer une table temporaire globale

Ici, nous allons créer une table temporaire globale pour conserver le salaire total par département de la table EMP. Vous pouvez télécharger le tableau EMP et les données à des fins de test à partir du lien suivant SCOTT Schema Tables. De plus, dans l'exemple ci-dessous, nous créons la table avec ON COMMIT DELETE ROWS clause, pour supprimer les lignes chaque fois qu'une instruction Commit est exécutée dans la procédure. Vous pouvez également utiliser ON COMMIT PRESERVE ROWS clause pour conserver les lignes dans la table jusqu'à ce que la session soit active.

CREATE GLOBAL TEMPORARY TABLE temp_dept
(
deptno NUMBER (4),
dname VARCHAR2 (50),
sal NUMBER
)
ON COMMIT DELETE ROWS;

Exemple d'utilisation de la table temporaire globale dans la procédure Oracle

La procédure suivante prendra le salaire total de chaque département et remplira la table temp_dept. Ensuite, il sélectionnera les enregistrements d'une table temp_dept et mettra à jour la colonne de commission de la table EMP avec 2 % du salaire total du service.

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;

Tester

SET SERVEROUTPUT ON;

BEGIN
prc_dept;
END;
/

Sortie

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.

Voir aussi :

  • Type de table dans l'exemple de procédure stockée
  • Comment comparer deux objets dans Oracle ?