sql >> Database teknologi >  >> RDS >> Oracle

Hvordan bruger man global midlertidig tabel i Oracle-proceduren?

I Oracle er globale midlertidige tabeller kendt som sessionstabeller, og vi bruger globale midlertidige tabeller til at holde dataene midlertidigt i dem under behandling. Nedenstående er et eksempel.

Opret en global midlertidig tabel

Her vil vi oprette en global midlertidig tabel til at holde afdelingsmæssig samlet løn fra EMP-tabellen. Du kan downloade EMP-tabellen og dataene til testformålet fra følgende link SCOTT Schema Tables. I eksemplet nedenfor opretter vi også tabellen med ON COMMIT DELETE ROWS klausul, for at slette rækkerne, når en Commit-sætning udføres i proceduren. Du kan også bruge ON COMMIT PRESERVE ROWS klausul for at bevare rækkerne i tabellen, indtil sessionen er aktiv.

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

Eksempel på brug af global midlertidig tabel i Oracle-proceduren

Følgende procedure vil tage den samlede løn fra hver afdeling og udfylde tabellen temp_dept. Derefter vælges posterne fra en temp_dept-tabel og opdaterer kolonnen EMP-tabellens provision med 2 % af den samlede afdelingsløn.

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;

Test

SET SERVEROUTPUT ON;

BEGIN
prc_dept;
END;
/

Output

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.

Se også:

  • Tabeltype i eksempel på lagret procedure
  • Hvordan sammenlignes to objekter i Oracle?
  1. Sådan håndteres fejl i SQL Server-indlejrede transaktioner

  2. php fil upload, hvordan man begrænser fil upload type

  3. Sammenlægning af to rækker til én, mens nulværdier erstattes

  4. Opret en CHECK-begrænsning i SQLite