1

100 個のテーブルを 1 つずつ更新する手順があります。すべてのテーブルには、更新する同じ列があります。パフォーマンスを向上させるために、FORALL で Execute Immediate を使用しようとしていますが、多くのコンパイル エラーが発生しています。

即時実行を使用して、FORALL ステートメント内で 100 の異なるテーブルを更新することは構文的に可能ですか。

私のコードは次のようになります。

Declare
  TYPE u IS TABLE OF VARCHAR2(240) INDEX BY BINARY_INTEGER;
      Table_List u;
FOR somecursor IN (SELECT variable1, variable2 FROM SomeTable) 
    LOOP 
        BEGIN 
            Table_List(1) := 'table1'; 
            Table_List(2) := 'table2'; 
            ......
            ......
            table_list(100):= 'table100';
       FORALL i IN Table_List.FIRST .. Table_List.LAST 
           EXECUTE IMMEDIATE 'UPDATE :1 SET column = :3 WHERE column = :2' 
             USING Table_List(i), somecursor.variable1, somecursor.variable2 ; 
     end loop;

このコードを通じて、私がやろうとしていることを人々が理解してくれることを願っています。何か大きな問題がある場合は、構文が正確に何であるか、また他の効率的な方法で実行できるかどうかを教えてください。

私のところに来るすべての助けに感謝します。

4

2 に答える 2

1

(1) いいえ、テーブル名にバインド変数を使用することはできません。

(2) EXECUTE IMMEDIATE を使用している場合、これは動的 SQL を意味しますが、FORALL では1 つのステートメントのみを実行する必要があります。別のテーブルを指定するとすぐに、別のステートメントについて話していることになります (テーブルの構造がたまたま同等であるかどうかに関係なく)。

通常の FOR ループでこれを行う必要があります。

于 2012-10-15T06:07:41.797 に答える
0

推測ですが、バインド変数をテーブル名として使用できるとは思いません。やってみました:

EXECUTE IMMEDIATE 'UPDATE ' || Table_List(i) || ' SET column = :2 WHERE column = :3' ...
于 2012-10-14T19:40:00.713 に答える