Oracleグローバル一時テーブルは一時的なオブジェクトではありません。それらは適切なヒープテーブルです。それらを一度作成し、任意のセッション それらを使用して、そのセッションにのみ表示されるデータを保存できます。 。
一時的な側面は、データが1つのトランザクションまたは1つのセッションを超えて永続化されないことです。重要な実装の詳細は、データが永続的なテーブルスペースではなく一時的なテーブルスペースに書き込まれることです。ただし、データは引き続きディスクに書き込まれ、ディスクから読み取られるため、グローバル一時テーブルの使用には顕著なオーバーヘッドがあります。
重要なのは、一時テーブルを削除して再作成することは想定されていないということです。 SQL ServerスタイルのロジックをOracleに移植しようとしている場合は、PL/SQLコレクションを使用して一時データをメモリ内に保持することを検討する必要があります。詳細をご覧ください。
ORA-14452
の具体的な原因 セッション中にデータが含まれている場合、セッションスコープが永続化されているグローバル一時テーブルを削除できないということです。テーブルが現在空であっても...
SQL> create global temporary table gtt23 (col1 number)
2 on commit preserve rows
3 /
Table created.
SQL> insert into gtt23 values (1);
1 row created.
SQL> commit;
Commit complete.
SQL> delete from gtt23;
1 row deleted.
SQL> commit;
Commit complete.
SQL> drop table gtt23;
drop table gtt23
*
ERROR at line 1:
ORA-14452: attempt to create, alter or drop an index on temporary table already in use
SQL>
解決策は、セッションを終了して再接続するか、(やや奇妙なことに)テーブルを切り捨ててからドロップすることです。
SQL> truncate table gtt23;
Table truncated.
SQL> drop table gtt23;
Table dropped.
SQL>
他のセッションがグローバル一時テーブルを使用している場合-それは可能です(したがって、グローバル 命名法)その後、すべてのセッションが切断されるまでテーブルを削除できません。
したがって、実際の解決策は、グローバル一時テーブルの適切な使用方法を学ぶことです。各レポートに一致する特定のグローバル一時テーブルを作成します。または、私が言うように、代わりにPL/SQLコレクションを使用します。または、適切に調整されたSQLの記述方法を学ぶだけでもかまいません。多くの場合、より適切なアクセスパスで保存できる、記述が不十分なクエリの回避策として一時テーブルを使用します。
完全なコードを見ると、フローはさらに奇妙に思えます:
- グローバル一時テーブルを削除して再作成します
- 一時テーブルにデータを入力する
- 一時テーブルからPL/SQL配列に選択
- PL/SQL配列からの一括挿入を使用して実際の表に挿入
ここには多くのオーバーヘッドと無駄なアクティビティがあります。あなたがする必要があるのはあなたがv2d_temp
に挿入するデータを取ることです vertical_design
に直接入力します 、理想的にはINSERT INTO ... SELECT*FROMステートメントを使用します。 JSON配列をクエリに変換するには前処理が必要ですが、JavaまたはPL/SQLのいずれかで簡単に実現できます。
グローバル一時テーブルがシナリオに適したソリューションではないことは確かです。
「私たちの上司や他の人は、自分のやり方で何かをし続けるので、それを変えることはできません」
あなたが持っているのはボスの問題です プログラミングの問題ではありません 。したがって、StackOverflowに関する限り、トピックから外れています。しかし、とにかくここにいくつかの提案があります。
覚えておくべき重要なことは、いくつかの次善のアーキテクチャの妥協について話しているのではないということです。上司が明確に提案していることは機能しません マルチユーザー環境で。したがって、オプションは次のとおりです。
-
ORA-14452
を無視します エラーが発生したら、本番環境に進み、すべてがひどくうまくいかない場合は、「しかし、あなたは私に言った」防御を使用します。これは最も弱いプレーです。 - グローバルテーブルを意図的にジャンクし、マルチユーザーシナリオで機能するものを実装します。実装を失敗させた場合、防御策がないため、これはリスクが高くなります。
- 上司に話しかけてください。
ORA-14452
に遭遇していることを伝えます エラー、あなたがいくつかの調査を行い、この方法でグローバル一時テーブルを使用することに関する根本的な問題のように見えるが、明らかに何かを見落としているとしましょう。次に、以前にこの問題を実装したときに、この問題をどのように回避したかを尋ねます。これにはいくつかの方法があります。回避策がある場合もあれば、これがグローバル一時テーブルを使用する間違った方法であることに気付く場合もあります。また、迷子になるように指示する場合もあります。いずれにせよ、これが最善のアプローチです。適切なレベルまで懸念を表明しました。
頑張ってください。