如何在不使用“CREATE TABLE”的情况下获取Oracle外部表“转储文件”

时间:2012-03-23 08:26:55

标签: oracle plsql

我有一个开发PL / SQL过程,在应用程序事务期间发生错误时转储表的内容,转储的内容必须与事务的ROLLBACK之前的表的内容匹配。

我考虑过使用外部表作为表的转储格式(TYPE ORACLE_DATAPUMP)。在浏览了Oracle文档后,我发现唯一的方法是执行:

CREATE TABLE tabtest_test (
F1 NUMBER,
F2 CHAR(10))
ORGANIZATION EXTERNAL (
TYPE ORACLE_DATAPUMP
DEFAULT DIRECTORY USER_DUMP_DEST
LOCATION ('tabtest.dmp’));

问题在于,通过执行“CREATE TABLE”,Oracle在失败的事务中执行隐式提交,需要在转储表后回滚。

我考虑使用“PRAGMA AUTONOMOUS_TRANSACTION;”执行“CREATE TABLE”,但它并不真正符合我们的需要,因为它会在我们的应用程序事务之外转储表的内容。

我的问题:有没有办法在不执行“创建表”的情况下获取'tabtest.dmp'?例如,直接访问负责此操作的Oracle API。

问候。

3 个答案:

答案 0 :(得分:1)

作为应用程序设置过程的一部分,如何创建外部表一次?

如果失败,您可以在可能需要它的事务开始时创建它。如果有错误,请填写;如果交易成功完成,请将其删除。

答案 1 :(得分:0)

如果(并且它是一个很大的IF)你可以使用AUTONOMOUS_TRANSACTIONS在一个单独的事务中创建表,我认为这是你需要做的。如果您设法在当前事务的范围内创建表,并将数据写入新创建的表,则所有权限的数据应在您执行ROLLBACK后立即消失。

您遇到的问题是大类问题的一个子集,称为“尝试将关系数据库视为平面文件时出现的问题”。当使用AS DATABASES时,关系数据库很棒,但是在平面文件方面真的很糟糕。它有点像农场里的动物 - 羊是很好的,但是要生出糟糕的奶牛。奶牛生产糟糕的山羊。山羊 - 伟大的动物 - 聪明,深情(是的),低维护,不会听到对他们说的话 - 但不是你想要的草稿动物 - 使用马,牛或骡子。基本上,你应该选择马匹课程(原谅表达)。数据库生成一个糟糕的平面文件,反之亦然。使用适当的。

IMO你最好将数据写入平面文件,也许这个文件可以作为外部表映射。您可能希望以多种其他工具可以处理的CSV格式编写文件。 YMMV。

分享并享受。

答案 2 :(得分:0)

为什么需要使用外部表?您可以使用UTL_FILE读取文件。

相关问题