假设使用就地程序每小时填充数据的表'Source'。我想运行一个程序,每次执行代理时,只用目标表SOURCE的新行填充我的新表'NEW',记住新表必须始终保持已插入数据的所有时间(我的意思是每次插入进程的解决方案... NEW然后插入到临时表中的不同值,删除NEW,从temp等插入并没有帮助)。
答案 0 :(得分:1)
如果我做对了你想要的东西,并且只是将SOURCE中的新记录插入到NEW中,有很多方法可以做到这一点。以下是其中一些:
1)在SOURCE上创建一个自动插入NEW的触发器,这样你就不用担心了。
2)使用这样的语句从SOURCE中仅选择新行。这假设两个表上的主键相同。
INSERT INTO NEW
SELECT * FROM SOURCE s1 WHERE NOT EXISTS (SELECT 1 FROM NEW n1 WHERE n1.key=s1.key)
3)使用物化视图& mv日志功能。这个有点复杂,如果您不熟悉,我建议您查看oracle文档或其他一些资源。
4)更改插入SOURCE的过程以插入NEW。
当然,如果SOURCE上有可能的更新,您必须弄清楚该怎么做。如果你愿意,我可以详细解释这些方法。
答案 1 :(得分:0)
投票支持dsmoljanovic的解决方案。 程序解决方案(带有时间戳或序列)对此不利的一个原因是未提交的数据。
举个例子:
At 02:55:00: 75 rows are added to SOURCE and are timestamped '02:55:00'
At 02:55:30: The 75 row insert is committed
At 02:59:55: 100 rows are added to SOURCE and are timestamped '02:59:55'
At 03:00:00: Your process kicks off and selects from source
At 03:00:20: The 100 row insert is committed
该进程将不会看到那100行(因为它们未提交),并且下次运行时,如果它在03:00:00之后查找时间戳的行,则可能会错过它们。