使用 PL/SQL 过程在 oracle 10g 中转储表

Posted

技术标签:

【中文标题】使用 PL/SQL 过程在 oracle 10g 中转储表【英文标题】:Taking dump of tables in oracle 10g using PL/SQL procedure 【发布时间】:2009-12-11 08:05:07 【问题描述】:

您好,需要立即回复,

我想从模式中转储一些选定的表,任何人都可以告诉我这可能吗? 任何人都可以通过执行我们可以转储的程序来提供程序吗?

例如我有架构、测试用户和表(T1、T2、T3、T5、T9),我只想转储 T1 和 T5。

提前致谢

【问题讨论】:

SO 不是“立即响应”的地方。这不能替代拥有支持合同。 【参考方案1】:

当您使用 10g 时,您可以使用 the Data Pump API 执行此操作。您需要对映射到目标 OS 目录的目录对象具有读写访问权限。

在以下示例中,我将两个表 EMP 和 DEPT 导出到一个名为 EMP.DMP 的文件中,该文件位于由 DATA_PUMP_DIR 标识的目录中。

SQL> declare
  2      dp_handle       number;
  3  begin
  4      dp_handle := dbms_datapump.open(
  5      operation   => 'EXPORT',
  6      job_mode    => 'TABLE');
  7
  8    dbms_datapump.add_file(
  9      handle    =>  dp_handle,
 10      filename  => 'emp.dmp',
 11      directory => 'DATA_PUMP_DIR');
 12
 13    dbms_datapump.add_file(
 14      handle    => dp_handle,
 15      filename  => 'emp.log',
 16      directory => 'DATA_PUMP_DIR',
 17      filetype  => DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE);
 18
 19    dbms_datapump.metadata_filter(
 20      handle => dp_handle,
 21      name   => 'NAME_LIST',
 22      value  => '''EMP'',''DEPT''');
 23
 24    dbms_datapump.start_job(dp_handle);
 25
 26    dbms_datapump.detach(dp_handle);
 27  end;
 28  /    

PL/SQL procedure successfully completed.

SQL> 

@DerekMahar 问:

“是否有类似的数据泵工具或 API 可用于从 客户端”

DataPump(PL/SQL API 和 OS 实用程序)写入 Oracle 目录。 Oracle 目录必须代表数据库可见的操作系统目录。通常这是服务器上的一个目录,尽管我认为理论上可以将 PC 驱动器映射到网络。你必须说服你的网络管理员这是个好主意,但很难卖,因为它不是......

较旧的 IMP 和 EXP 实用程序从客户端目录读取和写入,因此理论上可以将本地转储文件 IMP 到远程数据库中。但我不认为这是一种实用的方法。就其性质而言,转储文件往往很大,因此通过网络导入很慢并且容易失败。压缩转储文件,将其复制到服务器并从那里导入是一个更好的解决方案。

【讨论】:

是否有类似的数据泵工具或 API 可用于从客户端执行?【参考方案2】:

您应该尝试使用 DATAPUMP api (EXPDP/IMPDP)。它具有更多功能并具有 PLP/SQL API。 DATAPUMP 是 exp 和 imp 的替代品,在 10g 中受支持。

http://www.orafaq.com/wiki/Datapump#Invoking_from_PL.2FSQL

【讨论】:

【参考方案3】:

使用此命令,您将获得二进制 Oracle 转储: exp scott/tiger 文件=mydump.dmp 表=(T1,T5)

我推荐这个链接:http://www.orafaq.com/wiki/Import_Export_FAQ

【讨论】:

我想使用 PL/SQL 过程【参考方案4】:

如果您必须使用 PL/SQL,并且您正在尝试创建一个文件,那么您需要定义一个目录并授予您的用户写入权限。这是您的 DBA 可以做的事情。请参阅“创建目录”命令。

此时,您可以 (1) 调用 UTL_FILE 打开文件并向其中写入行或 (2) 创建“EXTERNAL TABLE”并将信息复制到其中或 (3) 使用 DBMS_XMLGEN 或 (4) 使用将数据从数据库实际写入文件的其他几种方法中的任何一种。所有这些都在 Oracle 文档中。 PL/SQL Packages and Types 手册是您的朋友。

请注意,实际的文件系统目录必须位于数据库所在的服务器上。因此,您可能需要访问该服务器以复制您的文件,或者让某人设置挂载或其他任何东西。

或者,您可以设置一个 plsql Web 服务,您可以调用该服务来获取您的数据。

但是,就我个人而言,我只会使用 exp。或者,如果不可用,可以使用 Toad 或其他一些前端工具(甚至是 SQL*Plus),您可以在其中编写一个简单的 SQL 脚本并保存结果。

如果您这样做是为了完成家庭作业,我猜他们会想要一个 UTL_FILE 解决方案。

【讨论】:

以上是关于使用 PL/SQL 过程在 oracle 10g 中转储表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 java 中使用 jdbc 为 oracle 10g 执行 log miner PL/SQL 查询

通过两个数据库链接使用 PL/SQL API

oracle 10g pl/sql 有条件的循环选择

如何使用触发器在同一张表中插入新行(Oracle PL/SQL 10G)?

如何一键提示两个命令? pl/sql oracle 10g 表单生成器

过程或函数 (Pl/sql)