sql >> データベース >  >> RDS >> Oracle

Oracleの一時テーブルの代替

    あなたが解決しようとしているビジネス上の問題は何ですか? Oracleで一時テーブルを使用する必要があることは非常にまれです。単純に

    SELECT *
      FROM employees
     WHERE id = p_id_passed_in;
    

    他のデータベースでは、リーダーがライターをブロックするため、一時テーブルを作成することがよくあります。そのため、他のセッションのブロックを回避するために、データの個別のコピーを作成する必要があります。ただし、Oracleでは、リーダーがライターをブロックすることはないため、通常、データの個別のコピーを保存する必要はありません。

    他のデータベースでは、ダーティ読み取りを実行したくないため、一時テーブルを作成します。ただし、Oracleはダーティ読み取りを許可していません。マルチバージョンの読み取り整合性とは、クエリの開始時(または、シリアル化可能なトランザクション分離レベルを設定している場合はトランザクションの開始時)に存在していたデータをOracleが常に表示することを意味します。したがって、ダーティリードを回避するために一時テーブルを作成する必要はありません。

    本当に Oracleで一時テーブルを使用したい場合は、テーブルを動的に作成しません。ストアドプロシージャを作成する前に、グローバル一時テーブルを作成します。テーブル構造はすべてのセッションに表示されますが、データはそれを挿入したセッションにのみ表示されます。プロシージャに一時テーブルを設定してから、テーブルにクエリを実行します。のようなもの

    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.
    

    ただし、前述したように、Oracleでは一時テーブルを実際に使用することは非常にまれです。



    1. HerokuでPostgresDBを破棄する

    2. C#で複数の要求に対して単一のSQL Server接続インスタンスを開いたままにする方法は?

    3. PHPスクリプトの未定義の変数エラー

    4. XSDからMySQLスキーマ