使用 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 查询
如何使用触发器在同一张表中插入新行(Oracle PL/SQL 10G)?