Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да използвам глобална временна таблица в процедурата на Oracle?

В 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?
  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Преобразувайте String ISO-8601 дата в типа данни за времеви печат на Oracle

  2. Трябва ли да посочим не null за първичен ключ? Oracle/SQL

  3. Различни CURRENT_TIMESTAMP и SYSDATE в oracle

  4. Как да замените нов ред в Oracle

  5. Повтарящи се стойности в колона