2

削除/更新の前にトリガーを使用して、テーブルの現在の行をミラー テーブルにコピーしようとしています。以下は作業クエリです

 BEFORE UPDATE OR DELETE 
  ON CurrentTable FOR EACH ROW
  BEGIN
      INSERT INTO MirrorTable
 ( EMPFIRSTNAME,
   EMPLASTNAME,
   CELLNO,
   SALARY
    )
VALUES
 ( :old.EMPFIRSTNAME,
   :old.EMPLASTNAME,
   :old.CELLNO,
   :old.SALARY
    ); 
END;

しかし、問題は、現在のテーブルに 50 を超える列があり、それらすべての列名を言及したくないことです。:old.* のようなすべてのカラムを選択する方法はありますか?

SELECT  * INTO MirrorTable FROM CurrentTable

どんな提案も役に立ちます。

ありがとう、

4

3 に答える 3

2

現実的には、いいえ。すべての列をリストする必要があります。

  • もちろん、から列名を取得するトリガー コードを動的に生成することもできますDBA_TAB_COLUMNS。しかし、それは単に 50 個の列名を入力するよりもはるかに多くの作業になります。
  • テーブルがたまたまオブジェクトテーブルで:newある場合、そのオブジェクトのインスタンスになるため、それを挿入できます。しかし、オブジェクト テーブルを持つことはかなりまれです。
于 2012-04-18T18:25:52.997 に答える
1

'current'テーブルと'mirror'テーブルがまったく同じ構造である場合、次のようなものを使用できる可能性があります。

INSERT INTO MirrorTable
  SELECT *
    FROM CurrentTable
    WHERE CurrentTable.primary_key_column = :old.primary_key_column

正直なところ、これは悪い選択であり、そうはならないと思いますが、それは多かれ少なかれ自由な世界であり、あなたは自由に(多かれ少なかれ:-)自分で選択することができます。

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

于 2012-04-18T18:37:32.393 に答える
0

価値があるので、私は同じものを書いていて、これを使ってコードを生成しました:

SQL> set pagesize 0
SQL> select ':old.'||COLUMN_NAME||',' from all_tab_columns where table_name='BIGTABLE' and owner='BOB';
:old.COL1,
:old.COL2,
:old.COL3,
:old.COL4,
:old.COL5,
...

すべての列をフィードする場合は、2 回言及する必要はありません (空の列には NULL を使用できます)。

INSERT INTO bigtable VALUES (
:old.COL1,
:old.COL2,
:old.COL3,
:old.COL4,
:old.COL5,
NULL,
NULL);

多くの列を持つテーブルを書いている人は、デザートを食べるべきではありません;-)

于 2013-05-23T18:42:50.347 に答える