sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo usar la tabla temporal global en el procedimiento de Oracle?

En Oracle, las tablas temporales globales se conocen como tablas de sesión y usamos tablas temporales globales para mantener los datos temporalmente mientras se procesan. El siguiente es un ejemplo.

Crear una tabla temporal global

Aquí crearemos una tabla temporal global para mantener el salario total por departamento de la tabla EMP. Puedes descargar la tabla EMP y los datos con fines de prueba desde el siguiente enlace SCOTT Schema Tables. Además, en el siguiente ejemplo, estamos creando la tabla con ON COMMIT DELETE ROWS cláusula, para eliminar las filas siempre que se ejecute una instrucción Commit en el procedimiento. También puede utilizar ON COMMIT PRESERVE FILAS cláusula para conservar las filas en la tabla hasta que la sesión esté activa.

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

Ejemplo para usar una tabla temporal global en un procedimiento de Oracle

El siguiente procedimiento tomará el salario total de cada departamento y llenará la tabla temp_dept. Luego seleccionará los registros de una tabla temp_dept y actualizará la columna de comisión de la tabla EMP con el 2 % del salario total del departamento.

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;

Prueba

SET SERVEROUTPUT ON;

BEGIN
prc_dept;
END;
/

Salida

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.

Ver también:

  • Tipo de tabla en el ejemplo de procedimiento almacenado
  • ¿Cómo comparar dos objetos en Oracle?