Mysql
 sql >> Database >  >> RDS >> Mysql

Alternativa per una tabella temporanea MySQL in Oracle

In Oracle, molto raramente hai bisogno di una tabella temporanea in primo luogo. Di solito hai bisogno di tabelle temporanee in altri database perché quei database non implementano la coerenza di lettura multi-versione e c'è la possibilità che qualcuno che legge i dati dalla tabella venga bloccato mentre la tua procedura è in esecuzione o che la tua procedura farebbe una lettura sporca se lo facesse Non salvare i dati in una struttura separata. Non hai bisogno di tabelle temporanee globali in Oracle per nessuno di questi motivi perché i lettori non bloccano i writer e non sono possibili letture sporche.

Se hai solo bisogno di una posizione temporanea per archiviare i dati mentre esegui calcoli PL/SQL, le raccolte PL/SQL sono più comunemente utilizzate rispetto alle tabelle temporanee in Oracle. In questo modo, non stai inviando i dati avanti e indietro dal motore PL/SQL al motore SQL e di nuovo al motore PL/SQL.

CREATE PROCEDURE do_some_processing
AS
  TYPE emp_collection_typ IS TABLE OF emp%rowtype;
  l_emps emp_collection_type;

  CURSOR emp_cur
      IS SELECT *
           FROM emp;
BEGIN
  OPEN emp_cur;
  LOOP
    FETCH emp_cur 
     BULK COLLECT INTO l_emps
    LIMIT 100;

    EXIT WHEN l_emps.count = 0;

    FOR i IN 1 .. l_emps.count
    LOOP
      <<do some complicated processing>>
    END LOOP;
  END LOOP;
END;

Puoi creare una tabella temporanea globale (al di fuori della procedura) e utilizzare la tabella temporanea globale all'interno della procedura proprio come faresti con qualsiasi altra tabella. Quindi puoi continuare a utilizzare le tabelle temporanee se lo desideri. Ma posso contare su una mano il numero di volte in cui ho davvero avuto bisogno di una tabella temporanea in Oracle.