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

Oracleストアドプロシージャのグローバル一時テーブルの代替方法

    T-SQL Tempテーブルは、基本的にメモリ構造です。これらは、2つのRDBMSアーキテクチャの違いにより、Oracleではあまり明白ではないMSSQLの利点を提供します。したがって、移行を検討している場合は、Oracleにより適したアプローチを取ることをお勧めします。

    ただし、状況は異なります。明らかに、2つのコードベースの同期を維持すると、作業が楽になります。

    一時テーブルを使用するときに最も近いのは、PL/SQLコレクションです。具体的には、ネストされたテーブル。

    これらを宣言する方法はいくつかあります。 1つ目は、SQLテンプレート(カーソル)を使用し、それに基づいてネストされたテーブルタイプを定義することです。 2つ目は、レコードタイプを宣言し、その上にネストされたテーブルを定義することです。いずれの場合も、コレクション変数に一括操作を入力します。

    declare
        -- approach #1 - use a cursor
        cursor c1 is 
              select *
              from t23;
        type nt1 is table of c1%rowtype;
        recs1 nt1;
    
        -- approach #1a - use a cursor with an explicit projection
        cursor c1a is 
              select id, col_d, col_2 
              from t23;
        type nt1a is table of c1a%rowtype;
        recs1 nt1a;
    
    
        -- approach #2 - use a PL/SQL record
        type r2 is record (
            my_id number
            , some_date date
            , a_string varchar2(30)
        );
        type nt2 is table of r2;
        recs2 nt2;
    begin
        select *
        bulk collect into recs1
        from t23;
    
        select id, col_d, col_2
        bulk collect into recs2
        from t23;
    end;
    /
    

    カーソルを使用すると、基になるテーブルの変更が自動的に反映されるという利点があります。 RECORDには、基になるテーブルの変更に直面しても安定性があるという利点がありますが。それはあなたが望むものに依存します:)

    PL/SQLリファレンスマニュアルには章全体があります。 詳細についてはこちらをご覧ください




    1. MySQLで秒を時間値に変更する方法

    2. MariaDBでのMICROSECOND()の動作

    3. 解析されたデータをPythonからSQLDeveloperのOracleテーブルにエクスポートするにはどうすればよいですか?

    4. MySQLのGRANTのテーブル名にワイルドカードを使用できますか