2012-03-22 7 views
1

更新しなければならないいくつかの瞬間に関するデータを持つ表があります。ただし、スペースと時間を節約するために、テーブルの各行は特定の曜日を参照し、その日の時間と曜日別のデータは同じ行の複数の列に分散しています。したがって、特定の瞬間のデータを更新する場合は、PL/SQLのプロシージャおよびファンクションで、ある種のプログラミング・ロジックを使用して更新する必要がある列を選択する必要があります。Oracle PL/SQL:動的に更新/マージ列を選択する

毎回新しいクエリ文字列を組み立てることなく、更新/マージ操作に関連する列を動的に選択する方法はありますか?パフォーマンスは問題であり、スループットは高くなければならないので、パフォーマンスが悪いものは実行できません。

編集:私は正規化の問題を認識しています。しかし、私はまだ列を動的にかつプログラム的に更新/マージするように選択する良い方法を知りたいと思っています。

+2

あなたの質問では、時間を節約していないと指摘しています...正規化と考えていますか、いくつかの表の説明を投稿できますか? – Ben

+1

合意 - これは正規化の問題のように聞こえる - その権利を得ることで他の問題がより簡単になる – Randy

答えて

3

DMLステートメントに使用する列を動的に選択する唯一の方法は、動的SQLを使用することです。また、動的SQLを使用する唯一の方法は、準備および実行できるSQLステートメントを生成することです。もちろん、動的SQLを使用することの費用を最小限に抑えるために、文字列を多かれ少なかれ効率的にアセンブルすることができます。文を一度解析して複数回実行することができます。しかし、静的SQLに近いものを実行する動的SQLを使用するには、かなり多くの作業が必要です。

私はベンのポイントをエコーし​​たいと思います。あなたのテーブルをこのように構造化することで時間を節約しているようには見えません。テーブルを適切に正規化することで、パフォーマンスが大幅に向上する可能性があります。私はあなたがあなたが貯蓄していると信じているスペースがわからないですが、テーブル構造を非正規化することは、スペースの面で何かがあれば、あなたを救うでしょう。

+0

私は今このアプローチを試し、私のデータ構造を見直すことを検討する。私がテーブルを正規化して構造を改造すると、私はあなたに私の行動の過程が何であるかを知らせます。皆さんありがとう! –

0

必要な作業を行う1つの方法は、可能なすべての更新を含むパッケージを作成することです(これはあまり多くありません。一定の時間に1つのフィールドを更新するだけです)。次に使用するクエリを選択します私の内部ロジック。しかし、これは大きなif/elseまたはswitch/case-likeステートメントにつながります。より良いパフォーマンスで同様の結果を達成する方法はありますか?

関連する問題