我有一个棘手的问题。在 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');
与视图/表 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 由作业每晚调用一次。所有 proc_import_table 调用都是硬编码的原因是某些表需要额外的导入信息。
恐怕我不能在这里复制/粘贴原始代码,因为我不知道我是否可以这样做。希望这可以帮助...