厄介な問題があります。Oracle 10 には、そのようなことが何度も繰り返されるビューとテーブルのペアがあります。
proc_log('DELETE 1');
DELETE FROM table_1;
proc_log('INSERT 1');
INSERT INTO table_1 SELECT * FROM view_1;
proc_log('FINISH 1');
View/Table 2 と 3 と 4 と 5... と 36 も同じです。
私はこのようなことをしたいと思います:
PROCEDURE proc_import(p_table VARCHAR2) IS
BEGIN
proc_log('DELETE ' || p_table);
EXECUTE IMMEDIATE 'DELETE FROM table_' || p_table;
proc_log('INSERT ' || p_table);
EXECUTE IMMEDIATE 'INSERT INTO table_' || p_table || ' SELECT * FROM view_' || p_table;
proc_log('FINISH || p_table);
COMMIT;
END;
次に、36 ペアすべてに対して関数を呼び出します。
驚くべきことではありませんが、これはハードコードされたものよりも約 50% 遅くなります。
私の質問: 高速化する方法について誰か考えがありますか? またはさらに良いことに、どうすればこれを他とは違うものにすることができますか?
編集
全体は次のように構築されます。
CREATE OR REPLACE PACKAGE PKG_IMPORT IS PROCEDURE proc_log IS BEGIN [funky not important stuff] END; PROCEDURE proc_import IS BEGIN proc_import_table('1', TRUE); proc_import_table('2'); proc_import_table('3'); proc_import_table('4', TRUE); proc_import_table('5'); ... proc_import_table('36'); END; PROCEDURE proc_import(p_table VARCHAR2, p_whole BOOLEAN DEFAULT FALSE) IS BEGIN proc_log('DELETE ' || p_table); IF p_whole THEN EXECUTE IMMEDIATE 'DELETE FROM table_' || p_table; ELSE EXECUTE IMMEDIATE 'DELETE FROM table_' || p_table || ' WHERE business_logic_applies'; END IF; proc_log('INSERT ' || p_table); EXECUTE IMMEDIATE 'INSERT INTO table_' || p_table || ' SELECT * FROM view_' || p_table; proc_log('FINISH || p_table); COMMIT; END; END PKG_IMPORT;
プロシージャ proc_import は、ジョブによって 1 晩に 1 回呼び出されます。すべての proc_import_table 呼び出しがハードコーディングされている理由は、一部のテーブルで追加のインポート情報が必要になるためです。
許可されているかどうかわからないため、ここに元のコードをコピーして貼り付けることはできません。お役に立てれば...