В Oracle, глобални временни таблици, известни като таблици на сесии и ние използваме глобални временни таблици, за да запазим данните временно в тях по време на обработка. По-долу е пример.
Създайте глобална временна таблица
Тук ще създадем глобална временна таблица, за да държим общата заплата по отдел от таблицата EMP. Можете да изтеглите EMP таблицата и данните за целите на тестването от следната връзка SCOTT Schema Tables. Също така, в примера по-долу създаваме таблицата с ЗА ИЗТРИВАНЕ НА РЕДОВЕ ЗА ИЗТРЯВАНЕ клауза, за да изтриете редовете всеки път, когато в процедурата се изпълнява инструкция Commit. Можете също да използвате ЗА ЗАПАЗВАНЕ НА РЕДОВЕ ЗА ЗАПАЗВАНЕ клауза за запазване на редовете в таблицата, докато сесията е активна.
CREATE GLOBAL TEMPORARY TABLE temp_dept ( deptno NUMBER (4), dname VARCHAR2 (50), sal NUMBER ) ON COMMIT DELETE ROWS;
Пример за използване на глобална временна таблица в процедурата на Oracle
Следващата процедура ще вземе общата заплата от всеки отдел и ще попълни таблицата temp_dept. След това ще избере записите от таблица temp_dept и ще актуализира колоната за комисионна на таблицата EMP с 2% от общата заплата на отдела.
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;
Тест
SET SERVEROUTPUT ON; BEGIN prc_dept; END; /
Изход
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.
Вижте също:
- Тип таблица в пример за съхранена процедура
- Как да сравним два обекта в Oracle?