sql >> Databasteknik >  >> RDS >> Oracle

Alternativ för tillfälliga tabeller i Oracle

Vilket är affärsproblemet du försöker lösa? Det är exceptionellt sällsynt att du behöver använda tillfälliga tabeller i Oracle. Varför skulle du inte helt enkelt

SELECT *
  FROM employees
 WHERE id = p_id_passed_in;

I andra databaser skapar du ofta tillfälliga tabeller eftersom läsare blockerar skribenter så du vill skapa en separat kopia av data för att undvika att blockera andra sessioner. I Oracle blockerar läsare dock aldrig skribenter, så det finns i allmänhet inget behov av att spara en separat kopia av data.

I andra databaser skapar du tillfälliga tabeller eftersom du inte vill göra smutsiga läsningar. Oracle tillåter dock inte smutsiga läsningar. Läskonsistens i flera versioner innebär att Oracle alltid visar dig data som den fanns när frågan startade (eller när transaktionen startade om du har ställt in en transaktionsisoleringsnivå på serialiserbar). Så det finns inget behov av att skapa en tillfällig tabell för att undvika smutsiga läsningar.

Om du verkligen ville använda temporära tabeller i Oracle, skulle du inte skapa tabellen dynamiskt. Du skulle skapa en global temporär tabell innan du skapade den lagrade proceduren. Tabellstrukturen skulle vara synlig för alla sessioner men data skulle endast vara synlig för den session som infogade den. Du skulle fylla i den temporära tabellen i proceduren och sedan fråga tabellen. Något liknande

CREATE GLOBAL TEMPORARY TABLE temp_emp (
  empno number,
  ename varchar2(10),
  job   varchar2(9),
  mgr   number,
  sal   number(7,2)
)
ON COMMIT PRESERVE ROWS;

CREATE OR REPLACE PROCEDURE populate_temp_emp
AS
BEGIN
  INSERT INTO temp_emp( empno,
                        ename,
                        job,
                        mgr,
                        sal )
    SELECT empno, 
           ename,
           job,
           mgr,
           sal
      FROM emp;
END;
/

SQL> begin
  2    populate_temp_emp;
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL> select *
  2    from temp_emp;

     EMPNO ENAME      JOB              MGR        SAL
---------- ---------- --------- ---------- ----------
      7623 PAV        Dev
      7369 smith      CLERK           7902        800
      7499 ALLEN      SALESMAN        7698       1600
      7521 WARD       SALESMAN        7698       1250
      7566 JONES      MANAGER         7839       2975
      7654 MARTIN     SALESMAN        7698       1250
      7698 BLAKE      MANAGER         7839       2850
      7782 CLARK      MANAGER         7839       2450
      7788 SCOTT      ANALYST         7566       3000
      7839 KING       PRESIDENT                  5000
      7844 TURNER     SALESMAN        7698       1500
      7876 ADAMS      CLERK           7788       1110
      7900 SM0        CLERK           7698        950
      7902 FORD       ANALYST         7566       3000
      7934 MILLER     CLERK           7782       1300
      1234 BAR

16 rows selected.

Som jag sa skulle det dock vara väldigt ovanligt i Oracle att faktiskt vilja använda ett tillfälligt bord.



  1. mysql ladda data lokal infil

  2. skicka en array som en parameter som ska användas i en SQL-fråga med IN-kommandot

  3. Hur skickar man en array till where-villkoret i CodeIgniter?

  4. relevanssökning i flera relaterade tabeller