1

現在、スケジュールされたジョブの完了後にシノニム定義を切り替えるシナリオがあります。このジョブは、偶数または奇数の時間に対応するevenorの識別子を持つテーブルを作成します。odd私たちが現在行っていることは次のとおりです。

odd_job:  

create foo_odd ...  
replace foo_syn as foo_odd

even_job:  

create foo_even ...  
replace foo_syn as foo_even

何が起こっているかというと、通常の生産中にfoo_synがロックされた状態になっているということです。したがって、私たちが探しているのは、シノニム定義を交換する本番対応の方法です。

問題は、Oracle 10g でユーザーの中断を最小限に抑えながら、本番レベルのシステムでシノニム定義をどのように交換できるかということです。

コメントから

foo_syn には依存オブジェクトがありますか?

Nofoo_synは、私が生成したテーブルへのポインタにすぎません。つまり、このスイッチのために再コンパイルする必要があるプロシージャはありません。

それは本当に奇妙なことのように聞こえます。そのスイッチの目的/使用方法を少し説明できますか?

もちろん。データベースとやり取りするアプリケーションがあり、Java から実行される SQL (ビジネス ロジック クエリ) には への参照がありfoo_synます。データの動的な性質のため、1 時間ごとのスワップにより、リアルタイムに近づけようとするときに重要な新しい結果が得られることが保証されています。これより前は、1 日 1 回で満足するタイプのシナリオでした。

スワップの理由は、動的 SQL (テーブル名に関して) をアプリケーション クエリの一部にしたくないからです。したがって、データベースは、アプリケーションの一部として参照されるシノニムの名前を変更せずに、新しいデータ セットに切り替えます。

4

2 に答える 2

3

動的 SQL の使用が不快である場合 (私の経験では、動的 SQL がパフォーマンスの問題であることが証明されたことはありませんが、YMMV であることをすぐに指摘します)、UNION クエリが探しているものである可能性があります。

SELECT *
  FROM EVEN_DATA_TABLE
  WHERE TO_NUMBER(TO_CHAR(SYSDATE, 'HH')) IN (0, 2, 4, 6, 8, 10, 12)
UNION ALL
SELECT *
  FROM ODD_DATA_TABLE
  WHERE TO_NUMBER(TO_CHAR(SYSDATE, 'HH')) IN (1, 3, 5, 7, 9, 11)

これにより、シノニムは SYSDATE から駆動されるため、定期的にシノニムを変更する必要がなくなります。

これは、EVEN_DATA_TABLE と ODD_DATA_TABLE の列が同じであると仮定します。

共有してお楽しみください。

于 2013-05-09T13:13:07.140 に答える
0

私たちが思いついた解決策は次のとおりです。

1) 表示するテーブルのセットを返す関数を定義します。

  create or replace function which_synonym return varchar2 as  
  to_return varchar2(4) := NULL;  
  is_valid number :=- 1;  
  current_time number := to_number(to_char(sysdate,'HH'));    
  is_odd boolean := FALSE;  

BEGIN   
   if = mod(current_time,2)    -- it is an even time slot
   then    
      select success into is_valid  
      from success_table  
      where run='EVEN';    
   else    
      select success into is_valid  
      from success_table  
      where run='ODD';  
   end if;  
   if is_valid=0 and is_odd=TRUE  
   then to_Return ='ODD';  
   else  
     to_return='EVEN';    
   end if;  
   Return to_return;   
END which_synonym;

簡潔にするために、ド・モルガンの法則は省略されています。

2) このフリッピングを利用するようにアプリケーション プロシージャを構成します。

a) 列挙された SQL 文字列を、一致させたいシーケンスでトークン化します。

select * from foo_&&&

b) このシーケンスを置き換える関数を書きます:

 public String whichSynonym(String sql)  
 {  
   if(null==sql || "".equals(sql.trim()))  
   {  
        throw new IllegalArgumentException("Cannot process null or empty sql");
   }    
   String oddEven = "";
     //removed boilerplate  
     PreparedStatement statement = conn.prepareStatement("Select which_synonym from dual");  
     statement.execute();  
     ResultSet results = statement.getResults();  
     while(results.next())  
     {
          oddEven=results.getString(1);  
     }    
     return sql.replace("&&&",oddEven);
 }  
于 2013-05-10T16:25:38.037 に答える