上下文:应用程序正在处理不同的文件,并通过单个插入为每个文件插入大量行(无法更改)。它在每个处理过的文件后提交(不应更改)。
任务:“处理某事”与处理一个文件所创建的所有行的总和,这意味着从最后一次提交到实际提交所创建的所有行。这可能就像是insert into sum_table select sum(a), sum(b), id from gtt_work_table group by id
(每个已处理文件的聚合值)一样简单。
解决方案的第一个想法非常简单:使用global temporary table
创建on commit delete rows
并执行before delete
触发器(几乎)执行我喜欢的每个事务的数据。
但它没有用。如此处DELETE TRIGGER ON GTT所述,触发器只会触发显式删除,而不会触发由提交引起的隐式删除。虽然,引用说的是Oracle 8所以:现在有没有办法在GTT清空之前执行sql / plsql?
对每行使用insert /触发器一般都可以工作,但由于保持单行级别而无法帮助我。在提交之前让应用程序执行某些操作(即明确地从gtt中删除)是不可能的,因为它在那时是不可自定义的。