Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Alternative für eine temporäre MySQL-Tabelle in Oracle

In Oracle benötigen Sie in erster Linie sehr selten eine temporäre Tabelle. Sie benötigen häufig temporäre Tabellen in anderen Datenbanken, da diese Datenbanken keine Multiversions-Lesekonsistenz implementieren und die Möglichkeit besteht, dass jemand, der Daten aus der Tabelle liest, blockiert wird, während Ihre Prozedur ausgeführt wird, oder dass Ihre Prozedur ein Dirty Read durchführen würde, wenn dies der Fall wäre Speichern Sie die Daten nicht in einer separaten Struktur. Aus diesen beiden Gründen benötigen Sie in Oracle keine globalen temporären Tabellen, da Reader Writer nicht blockieren und Dirty Reads nicht möglich sind.

Wenn Sie nur einen temporären Ort zum Speichern von Daten benötigen, während Sie PL/SQL-Berechnungen durchführen, werden PL/SQL-Sammlungen häufiger verwendet als temporäre Tabellen in Oracle. Auf diese Weise schieben Sie keine Daten von der PL/SQL-Engine zur SQL-Engine und wieder zurück zur PL/SQL-Engine.

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;

Sie können eine globale temporäre Tabelle (außerhalb der Prozedur) erstellen und die globale temporäre Tabelle innerhalb Ihrer Prozedur genauso verwenden, wie Sie jede andere Tabelle verwenden würden. Sie können also weiterhin temporäre Tabellen verwenden, wenn Sie dies wünschen. Aber ich kann an einer Hand abzählen, wie oft ich wirklich eine temporäre Tabelle in Oracle brauchte.