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?
-
Estrutura de Alta Disponibilidade do MySQL Explicada – Parte III:Cenários de Falha
-
Noções básicas de automação de tarefas do SQL Server
-
Como as atualizações automáticas de estatísticas podem afetar o desempenho da consulta
-
Configurar o ambiente de inicialização no SQL Server Management Studio (SSMS) - Tutorial do SQL Server/TSQL Parte 7