Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como usar a tabela temporária global no procedimento Oracle?


No Oracle, tabelas temporárias globais conhecidas como tabelas de sessão e usamos tabelas temporárias globais para manter os dados temporariamente nela durante o processamento. O abaixo é um exemplo.

Criar uma tabela temporária global


Aqui, criaremos uma tabela temporária global para manter o salário total do departamento da tabela EMP. Você pode baixar a tabela EMP e os dados para fins de teste a partir do seguinte link SCOTT Schema Tables. Além disso, no exemplo abaixo, estamos criando a tabela com ON COMMIT DELETE ROWS cláusula, para excluir as linhas sempre que uma instrução Commit for executada no procedimento. Você também pode usar as ON COMMIT PRESERVE ROWS cláusula para preservar as linhas na tabela até que a sessão esteja ativa.
CREATE GLOBAL TEMPORARY TABLE temp_dept
(
deptno NUMBER (4),
dname VARCHAR2 (50),
sal NUMBER
)
ON COMMIT DELETE ROWS;

Exemplo de uso de tabela temporária global no procedimento Oracle


O procedimento a seguir obterá o salário total de cada departamento e preencherá a tabela temp_dept. Em seguida, selecionará os registros de uma tabela temp_dept e atualizará a coluna de comissão da tabela EMP com 2% do salário total do 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;

Teste

SET SERVEROUTPUT ON;

BEGIN
prc_dept;
END;
/

Saída

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.

Veja também:

  • Tipo de tabela no exemplo de procedimento armazenado
  • Como comparar dois objetos no Oracle?